2013-04-26 76 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