2013-03-05 27 views
2

我正在使用窗口對象和延遲爲了注入一些內容到我的控制器,這是我創建它時不可用。第一次我打電話時,這樣工作的很好 - .then方法執行得很好。但是當我隨後調用它時,.then方法不會觸發。什麼會造成這種情況?angularjs推遲然後只被調用一次

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

? – smk 2013-03-05 18:54:34

+0

不應該在結果中看到4,5,6而不是1,2,3? – VBAHole 2013-03-05 18:56:23

+0

爲什麼將延期添加到'$ window'而不是將服務注入到控制器中?順便說一句:「$摘要已經在進行中」是*不是*一個正常的錯誤,絕對是你不應該忽略的。它表明你的代碼有問題。 – 2013-03-05 18:57:49

回答

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

這只是一個方式做到這一點,但它應該工作,這是相當乾淨。如果你想創建一個服務來傾聽事件並設置它,你可以。

+0

無論它的'$ rootScope。$ emit'或'$ rootScope.broadcast'。你可以請。澄清。 – rajkamal 2013-03-05 20:01:37

+1

我的不好,應該是$廣播......因爲它會向下到所有的子範圍。 – 2013-03-05 20:13:24

+0

我的'跑塊'是什麼?目標是從非角度代碼向我的控制器注入一個值。我的運行代碼(觸發事件)沒有$ – VBAHole 2013-03-06 16:02:43

0

我有同樣的問題,我通過definin德每次延期固定它,我想你會是這樣的:你爲什麼說方法runAgain犯規得到再次發射

$window.injectIntoAngularWorld = function (obj) { 
    var deferred = $q.defer(); 
    deferred.resolve(obj); 
    $rootScope.$apply(); 
};