我正在使用窗口对象和延迟,以便将一些内容注入我的控制器中,这在创建它时是不可用的。我第一次调用它时工作正常 - .then方法执行得很好。但是当我随后调用它时,.then方法没有触发。什么可能导致这种情况?
app.factory('fromoutside', function ($window, $q, $rootScope) {
var deferred = $q.defer();
$window.injectIntoAngularWorld = function (obj) {
deferred.resolve(obj);
$rootScope.$apply();
};
return deferred.promise;
});
这是一种模仿我正在做但不完全正确的事。它会引发有关已在进行中的应用的错误,但是再次,我得到了很多并经常忽略它们fiddle
答案 0 :(得分:4)
对于这类事情你可能会更好地使用一个事件。
承诺得到解决,然后就完成了。所以这意味着他们只是一次性交易。
以下是我的建议:
//set it up in your run block.
app.run(function($rootScope, $window) {
$window.foo = function (data) {
$rootScope.$broadcast('fooCalled', data);
};
});
//use $on in your controller.
app.controller('MyCtrl', function($scope){
$scope.$on('fooCalled', function(event, data) {
$scope.fooData = data;
});
});
这只是一种方式,但它应该有效,而且相当干净。如果你想创建一个服务来收听事件并进行设置,你可以。
答案 1 :(得分:0)
我遇到了同样的问题,我每次都通过定义来修复它,我想你会是这样的:
$window.injectIntoAngularWorld = function (obj) {
var deferred = $q.defer();
deferred.resolve(obj);
$rootScope.$apply();
};