2016-07-20 8 views
0

私はQSocksを使用してAPI(Qlik Sense Engine API)に接続するAngularJSでWebアプリケーションを構築しています。

Qsocksは、NodeJSで記述されているQlik Sense Engine APIラッパーの軽量ラッパーですが、Web環境でもインポートできます。 QSocksにはNPMパッケージPromiseパッケージが含まれていますので、AngelsJS以外の約束を使用しています。

私のサービスは、次のようになります。私は、例えばでこのサービスを呼び出すときに、簡単な言葉で

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; 

    } 

コントローラ。私はそこに他のオブジェクトを構築することができるオブジェクトを取得します。

側注: 私はapp_promise.thenobj.createChild(ratioChild).thenは、NPMの約束パッケージ約束されているので、新しいAngularJSを約束ようにする必要があります。

これは私のコントローラは、(最初​​の部分)のように見える方法です:

 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(); 
     } 

これは私のコントローラは、(第二部)どのように見えるかです:

 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! 

$scope.$apply()で私の見解を公開していている/更新1秒後に

私が$scope.$apply()を除外した場合は、ビューを公開/更新しますが、10-15秒後には..遅くまで!なぜ私の意見はとても遅いのですか?私は除外したいです$scope.$apply()

+0

を呼び出すサービス機能を作成することでした;' '$ scope($ function(){deferred.resolve(childObj);})'でスコープを変更します。このようにして、ダイジェストサイクルは「非角度」の約束が解決され、ビューが適切に更新されるとトリガされます。 – floribon

+0

@floribon '$ scope'はサービスに存在しません – charlietfl

+1

' childObj.getLayout() 'は' QSocks'約束を返しますか?表示されているサービスは、あなたがしているときに '$ q'を使って' $ apply'を処理する必要があります – charlietfl

答えて

0

私は自分自身の問題を解決することができます。振り返ってみると、私の問題は何か分かりました。

ありがとう@charlietfl私はchildObj.getLayout()を見てきました。 getLayout()関数がQSocksの約束を返し、私のビューを更新するコードがQSocksの約束の.then()の中に書かれていたことを私は見ました。 getLayout()は目に見えるものではないため、これが問題でした。私のビューは正しく更新されませんでした。

私のソリューションは、 `deferred.resolve(childObj)を交換してみアンギュラ約束

this.getObjLayout = function(childObj) { 

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

を作成し、コントローラに、私はその機能

 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; 
       } 
      }) 
     } 
関連する問題