Răsfoiți Sursa

Вытащил http-клиент в отдельный компонент

Denis V. Dedkov 7 ani în urmă
părinte
comite
39aeb66fff
3 a modificat fișierele cu 46 adăugiri și 22 ștergeri
  1. 30 0
      HttpClient.qml
  2. 15 22
      LightsModel.qml
  3. 1 0
      qml.qrc

+ 30 - 0
HttpClient.qml

@@ -0,0 +1,30 @@
+import QtQuick 2.0
+
+QtObject {
+    id: root
+
+    signal reply(var data)
+    signal error(string text)
+
+    function get(url) {
+        var request = new XMLHttpRequest()
+
+        request.open('GET', url)
+        request.onreadystatechange = function () {
+            if (request.readyState !== XMLHttpRequest.DONE) {
+                return
+            }
+
+            if (request.status === 200) {
+                root.reply(JSON.parse(request.responseText))
+                return
+            }
+
+            root.error(qsTr("[%1] Request error: %2").
+                       arg(request.status).
+                       arg(request.statusText))
+        }
+
+        request.send()
+    }
+}

+ 15 - 22
LightsModel.qml

@@ -3,6 +3,20 @@ import QtQml.Models 2.1
 ListModel {
     id: root
 
+    readonly property var httpClient: HttpClient {
+        id: httpClient
+
+        onError: {
+            root.error(text)
+            root.isLoading = false
+        }
+
+        onReply: {
+            root.populateModel(data)
+            root.isLoading = false
+        }
+    }
+
     property string serviceUrl: undefined
     property bool isLoading: false
 
@@ -11,29 +25,8 @@ ListModel {
     onServiceUrlChanged: reload()
 
     function reload() {
-        var request = new XMLHttpRequest()
-
-        request.open('GET', root.serviceUrl + '/static/channels.js')
-        request.onreadystatechange = function () {
-            if (request.readyState !== XMLHttpRequest.DONE) {
-                return
-            }
-
-            if (request.status === 200) {
-                populateModel(JSON.parse(request.responseText))
-                root.isLoading = false
-                return
-            }
-
-            root.error(qsTr("[%1] Request error: %2").
-                      arg(request.status).
-                      arg(request.statusText))
-
-            root.isLoading = false
-        }
-
+        root.httpClient.get(root.serviceUrl + '/static/channels.js')
         root.isLoading = true
-        request.send()
     }
 
     function populateModel(data) {

+ 1 - 0
qml.qrc

@@ -11,5 +11,6 @@
         <file>GradientButton.qml</file>
         <file>lamp.png</file>
         <file>Off.png</file>
+        <file>HttpClient.qml</file>
     </qresource>
 </RCC>