需要使用$ scope.apply()否则查看有时慢

时间:2016-07-20 12:52:35

标签: angularjs angular-promise

因此,我在AngularJS中构建一个Web应用程序,该应用程序通过QSocks连接到API(Qlik Sense Engine API)。

Qsocks是围绕Qlik Sense Engine API包装器的轻量级包装器,它使用NodeJS编写,但也可以在Web环境中导入。 QSocks包含并使用NPM包Promise包,因此它使用它自己的非AngularJS承诺。

我的服务如下:

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;

    }

简单来说,当我将此服务称为例如一个控制器。我得到一个对象,我可以在其上构建其他对象。

旁注: 我确实需要制定新的AngularJS承诺,因为app_promise.thenobj.createChild(ratioChild).then是NPM承诺包的承诺。

这就是我的控制器的样子(第一部分):

        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()我的视图会在一秒后发布/更新。

如果我遗漏$scope.$apply()它会发布/更新视图,但是在10-15秒之后......迟到了!为什么我的观点如此之慢?我想省略$scope.$apply()

1 个答案:

答案 0 :(得分:0)

我设法解决自己的问题。回头看之后我的问题很明显。

感谢 @charlietfl ,我已经看了childObj.getLayout()。我看到getLayout()函数返回QSocks承诺的内容以及更新我的视图的代码是在QSocks承诺的.then()内写的。由于getLayout()不是一个有角度的承诺,这就是问题所在。我的观点没有正确更新。

我的解决方案是创建一个创建角度承诺的服务功能

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