2013-04-26 104 views
0

免責聲明節省$範圍,我是新來的angularjs :)angularjs通過關閉

我必須委託給一個服務,我嘗試保持$範圍,所以我可以後scope.apply控制器設置屬性:

var Build = function($scope, $http, mango) { 
    var scope = $scope; 
    $scope.BuildManagerSubmit = function(selectedProfile) { 
     mango.buildMango(selectedProfile.def, function(profiledef) { 
      // bunch of property assignments on selectedProfile ... 
      scope.$apply(); 
     }, scope); 
    }; 
}; 
controllers.controller('Build', ['$scope', '$http', 'mango', Build]); 

注意,我使用的封閉件來保存的範圍和在將其傳遞給該服務(爲簡潔起見省略)。該服務將我稱爲cb.call(context,...),以便保持對scope的訪問。這一切都很好,但我更關心是否有更好的習慣用法。在委託給像這樣的服務時,我沒有看到很多維護$ scope的例子。

編輯:這個應用程序是使用節點的WebKit和「芒果」的服務基本與文件系統交互調出shell腳本等

+0

什麼是doind mango.buildMango?有角度服務來自動處理超時或XMLHttpRequest,所以你不必做那種東西 – Guillaume86 2013-04-26 16:23:09

+0

應用程序使用node-webkit和芒果服務與文件系統交互 – user2276815 2013-04-26 16:54:35

+0

好吧,我會注入$ rootScope在芒果服務並從那裏調用$ rootScope。$ apply()。之後,當您在其他地方使用芒果服務時,您不必再擔心。 – Guillaume86 2013-04-26 16:59:57

回答

0

我會做的芒果服務照顧的是(注入$ rootScope),也許使用promises來代替回調,所以它看起來像這樣:

var Build = function($scope, $http, mango) { 
    $scope.BuildManagerSubmit = function(selectedProfile) { 
     selectedProfile.profileDef = mango.buildMango(selectedProfile.def); 

     // do something when profileDef returned? (not always necessary) 
     selectedProfile.profileDef.then(function(profileDef) { 

     }); 
    }; 
}; 
controllers.controller('Build', ['$scope', '$http', 'mango', Build]); 
+0

但是,服務不需要負責執行對selectedProfile屬性的分配(在調用$ rootScope.apply()之前),因爲這是我們首先調用apply的原因嗎?我不確定我對添加綁定到單個責任包裝shell命令的服務的責任感到高興。 – user2276815 2013-04-26 18:23:29

+0

你不告訴你的服務做綁定,你告訴你的服務通知角度該範圍可能已經改變,任何做角度外的異步工作的服務應該這樣做。賦值(如果需要,不確定,角度句柄承諾是透明的,所以你通常不需要這樣做),將在'promise.then'中完成,就像我在代碼中所建議的那樣 – Guillaume86 2013-04-26 18:26:01