S.C*_*.C. 106 data-binding angularjs angularjs-scope angular-services
将"当前"传递$scope给AngularJS服务是否正确?
我正处于这样一种情况,我知道它仅由一个控制器消耗,并且我希望在$ service方法本身中引用控制器的范围.
这在哲学上是否正确?
或者我最好将事件广播到$ rootScope然后让我的控制器听取它们?
F L*_*has 15
我会说,如果您的功能仅限于一个控制器而不是您不需要服务.
控制器任务是操纵特定模型,而服务应该处理全局任务.我宁愿坚持这种范式而不是混淆.
这就是文档所说的
服务
角色服务是执行Web应用程序通用的特定任务的单例
调节器
在Angular中,控制器是一个JavaScript函数(类型/类),用于扩充角度范围的实例,不包括根范围.
PS:除此之外,如果你需要消化,你也可以在你的服务中注入$ rootScope.
是.初始化时,可以将$ scope传递给服务.在服务构造函数中,您可以将范围分配给this._scope,然后引用服务中的范围!
angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {
$scope.someVar = 4;
$scope.blahService = new blahService($scope);
});
angular.module('blah').factory('blahService', function() {
//constructor
function blahService(scope) {
this._scope = scope;
this._someFunction()
}
//wherever you'd reference the scope
blahService.prototype._someFunction = function() {
this._scope['someVar'] = 5;
}
return blahService;
});
Run Code Online (Sandbox Code Playgroud)
我个人认为传递$scope给服务是一个坏主意,因为它创建了一个有点循环引用:控制器依赖于服务,服务取决于控制器的范围.
除了在关系方面令人困惑之外,像这样的事情最终会妨碍垃圾收集器.
我首选的方法是将域对象放在控制器作用域中并将其传递给服务.这样,无论是在控制器内使用还是将来在其他服务中使用,服务都能正常工作.
例如,如果服务应该从数组推送和弹出元素errors,我的代码将是:
var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);
Run Code Online (Sandbox Code Playgroud)
然后,服务通过操作与控制器进行交互errors.当然,我必须谨慎从不消除整个阵列参考,但在一天结束时,这是一个普遍的JS问题.
我永远不想使用广播$apply和/或类似的东西,因为非常好的OO实践总是胜过Angular-magics.
| 归档时间: |
|
| 查看次数: |
68074 次 |
| 最近记录: |