因此,我在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.then
和obj.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()
答案 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;
}
})
}