2016-07-20 6 views
0

Also baue ich eine Web-Anwendung in AngularJS, die eine Verbindung zu einer API (Qlik Sense Engine API) mit QSocks.

Qsocks ist ein einfacher Wrapper für den Qlik Sense Engine-API-Wrapper, der in NodeJS geschrieben ist, aber auch in eine Web-Umgebung importiert werden kann. QSocks enthält und verwendet das Paket "Promise" des NPM-Pakets, so dass es eigene non AngularJS-Versprechungen verwendet.

Mein Service sieht wie folgt aus:

var app_promise = (appFactory.activeConnection() ? appFactory.activeConnection() : appFactory.app()); 

    this.getData = function(qMeasures, time) { 

     ratioChild.qHyperCubeDef.qMeasures[0].qDef.qDef = qMeasures; 
     ratioChild.qHyperCubeDef.qMeasures[0].qDef.qLabel = qMeasures; 

     ratioChild.qHyperCubeDef.qDimensions[4].qDef.qFieldDefs = [time]; 
     ratioChild.qHyperCubeDef.qDimensions[4].qDef.qFieldLabels = [time]; 

     var deferred = $q.defer(); 
     app_promise.then(function (obj) { 
      obj.createChild(ratioChild).then(function (childObj) { 
       deferred.resolve(childObj); 
      }); 
     }); 
     return deferred.promise; 

    } 

In einfachen Worten, wenn ich nenne diesen Dienst in z.B. ein Controller. Ich bekomme ein Objekt, wo ich andere Objekte bauen kann.

Side Hinweis: Ich brauche eine neue AngularJS zu versprechen, weil app_promise.then und obj.createChild(ratioChild).then die NPM Versprechen Paket Versprechen sind. Diese

ist, wie mein Controller wie (erster Teil) aussieht:

 if (!$rootScope.balanceSheetFixedObj) { 

      var fixYearsqMeasure = "Sum({<Jaar=>}Saldo)"; 
      balanceSheetService.getData(fixYearsqMeasure, self.time).then(function (childObj) { 

       $rootScope.balanceSheetFixedObj = childObj; 
       return childObj; 

      }).then(handleFixData) 
     } else { 
      handleFixData(); 
     } 

Dies ist, wie mein Controller wie (zweiter Teil) aussieht:

 function handleFixData(childObj) { 

      childObj = (childObj) ? childObj : $rootScope.balanceSheetFixedObj; 

      childObj.getLayout().then(function(data) { 

       self.data = data; 

       if (data.qHyperCube.qPivotDataPages[0].qData.length > 0) { 

        var fixPivotData = data.qHyperCube.qPivotDataPages[0]; 

        self.labels = fixPivotData.qLeft; 
        $scope.$apply(); // Here is my problem! 

Mit $scope.$apply() meiner Sicht veröffentlicht ist/aktualisiert nach einer Sekunde.

Wenn ich die $scope.$apply() weglassen es veröffentlichen/aktualisieren Sie die Ansicht aber nach 10-15 Sekunden .. Viel zu spät! Warum ist meine Sicht so langsam? Ich würde gerne die $scope.$apply()

+0

Versuchen zu ersetzen 'deferred.resolve (childObj)

this.getObjLayout = function(childObj) { var deferred = $q.defer(); childObj.getLayout().then(function(data) { deferred.resolve(data); }); return deferred.promise; } 

Und in der Steuerung erzeugt;' mit $ scope. $ apply (function() {deferred.resolve (childObj);}) '. Auf diese Weise wird ein Digest-Zyklus ausgelöst, wenn das "nicht-eckige" Versprechen verrechnet wird und die Ansicht korrekt aktualisiert wird. – floribon

+0

@floribon '$ scope' existiert nicht im Service – charlietfl

+1

Liefert 'childObj.getLayout()' ein' QSocks 'Versprechen? Der angezeigte Dienst sollte auf '$ apply' achten, indem Sie' $ q' verwenden, wie Sie es tun – charlietfl

Antwort

0

auslassen Ich schaffe es, mein eigenes Problem zu lösen. Nach dem Rückblick war es ziemlich offensichtlich, was mein Problem war.

Dank @charlietfl habe ich einen Blick auf die childObj.getLayout(). Was ich sah, was die getLayout() Funktion eine QSocks Versprechen zurückgibt und der Code, der meine Ansicht aktualisiert, wurde innerhalb der der QSocks Versprechen geschrieben. Als getLayout() ist kein Winkel Versprechen, das war das Problem. Meine Ansicht wurde nicht korrekt aktualisiert.

war meine Lösung, die eine Servicefunktion zu schaffen, die eine Winkel Versprechen, das ich aufrufen, die Funktion

 function handleFixData(childObj) { 

      childObj = (childObj) ? childObj : $rootScope.balanceSheetFixedObj; 

      balanceSheetService.getObjLayout(childObj).then(function (data) { 

       self.data = data; 

       if (data.qHyperCube.qPivotDataPages[0].qData.length > 0) { 

        var fixPivotData = data.qHyperCube.qPivotDataPages[0]; 
        self.labels = fixPivotData.qLeft; 
       } 
      }) 
     }