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()
Versuchen zu ersetzen 'deferred.resolve (childObj)
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
@floribon '$ scope' existiert nicht im Service – charlietfl
Liefert 'childObj.getLayout()' ein' QSocks 'Versprechen? Der angezeigte Dienst sollte auf '$ apply' achten, indem Sie' $ q' verwenden, wie Sie es tun – charlietfl