我目前有一个模态(Angular-UI模态),当它第一次打开时,效果很好。然而,在我关闭它然后重新打开它之后,事情开始变得有些奇怪。
代码:
(function () {
'use strict';
angular.module('app.modals').controller('personalizeNewsSubscriptionsModalCtrl', ['$scope', '$log', '$modalInstance', '$q', 'termStoreSvc', 'userNewsSubscriptionsSvc',
function ($scope, $log, $modalInstance, $q, termStore, userSub) {
//#region Variable declaration
var allTopics = [],
userSubs = [],
subscriptions = new termStore('Manaaged Metadata Service', 'TS Today', 'Topic'),
userSubscriptions = new userSub('blackba');
var allSubsLoaded = subscriptions.ready(function () {
allTopics = subscriptions.terms;
}),
userSubsLoaded = userSubscriptions.ready(function () {
userSubs = userSubscriptions.subscriptions;
});
$log = $log.getInstance('app.modals.personalizeNewsSubscriptionsModalCtrl');
//#endregion
$q.all([allSubsLoaded, userSubsLoaded]).then(function () {
// use allTopics and userSubs to create $scope.subscriptions
$scope.subscriptions = allTopics.map(function (obj) {
return {
Title: obj,
Selected: userSubs.indexOf(obj) !== -1
}
});
$log.debug('Subscriptions object loaded', $scope.subscriptions);
});
subscriptions.init();
userSubscriptions.init();
$scope.close = function () {
$modalInstance.dismiss('cancel');
}
}]);
})();
allSubsLoaded
和userSubsLoaded
对象是承诺。要了解如何解决这些问题,请参阅我的服务的简化版
(function () {
'use strict';
angular.module('app.services.sharepoint')
.factory('termStoreSvc', ['$log', '$q', function ($log, $q) {
var self = undefined,
deferred = $q.defer(),
promise = deferred.promise;
var termStoreSvc = function () {
self = this;
self.init = init;
self.ready = function (fn) {
return promise.then(fn);
}
};
function init() {
$log.debug('Initializing');
// do some stuff here
$log.debug('Initialized');
deferred.resolve();
};
return termStoreSvc;
}]);
})();
当我调用init时,它执行一些操作然后解析我声明的隐藏的承诺,然后当ready()
与回调函数一起使用时,回调不会执行直到init()
方法已经完成。
出于某种原因,在我第一次打开/关闭它并打开第二个/第三个/等等时间之后,$q.all({array of promises})
就会提前解决。有什么想法吗?
解决方案的代码示例:
问题是我在工厂返回的对象上没有承诺和延期对象,这意味着它们被保留(所以在第一次它们仍然显示为已解决后,导致我{ {1}}完成"早期")。
$q.all()
答案 0 :(得分:1)
嗯,我看到它的方式,工厂意味着返回对象,可能有作为属性的功能,我从来没有做过工厂的新实例(新的termStore事物)。就像你在第一次已经解决的内存堆栈上放了一个承诺。单身人士模式可能会干扰你的意图。
答案 1 :(得分:1)
Angular工厂是一个单身人士。在工厂定义中声明的任何内容都将在程序的生命周期中实例化一次。当然,每当你new
一个实例时,在工厂返回的对象中声明的任何东西都会被实例化。
在您的情况下,在工厂定义中声明了promise,工厂的每个实例都创建了相同promise的引用。因此,除了第一个实例之外,你的承诺已经解决了。