2

我正在使用 window 对象和 defer 来将一些内容注入到我的控制器中,这些内容在我创建它时不可用。这在我第一次调用它时工作正常 - .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;
});

这是一个模拟我正在做的事情的小提琴,但不完全是。它会抛出关于已经在进行中的应用的错误,但话又说回来,我得到了很多并且经常忽略它们

4

2 回答 2

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

这只是一种方法,但它应该可以工作,而且相当干净。如果你想创建一个服务来监听事件并设置它,你可以。

于 2013-03-05T19:32:38.993 回答
0

我有同样的问题,我每次都通过definin de deferred修复它,我想你会是这样的:

$window.injectIntoAngularWorld = function (obj) {
    var deferred = $q.defer();
    deferred.resolve(obj);
    $rootScope.$apply();
};
于 2014-12-17T02:58:45.883 回答