Angular控制器中的所有方法都必须在`$ scope`上吗?

时间:2015-07-29 11:09:13

标签: javascript angularjs angularjs-scope

我看到很多控制器除了范围之外没有成员。我认为从未直接从绑定表达式访问的共享验证和业务逻辑代码不需要知道非范围代码,只有从视图访问的成员实际上必须在范围内。

有人可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

没错。应该将partial和指令中表达式可用的函数分配给$ scope对象。

所有其他逻辑都不一定。如果您计划在控制器之间重用任何逻辑,最好将其提取到工厂/服务中。

答案 1 :(得分:1)

$scope是将控制器绑定到视图的内容;它是一个可以动态调整的特殊原型对象,可以很容易地快速连接到视图。但是,直接使用$scope并不是处理控制器的唯一方法。

由于prototypical nature of $scope,并且在给定页面上可能存在多个范围,因此通常建议在处理$scope时遵循“点规则”。从本质上讲,点规则只是建议不要将基元分配给$scope,例如$scope.myString,总是更喜欢“使用点”,或者将对象分配给$scope,la $scope.someObject.myString

从angular 1.2开始,引入了一种新语法,旨在帮助完成此任务,即ControllerAs语法。实质上,它允许您使用类似$scope的语法将控制器(已经是对象)直接分配给ng-controller = "someController as ctrl",然后将所有绑定作为控制器的属性引用, la ctrl.myString。您现在自动使用“点规则”,甚至无需考虑它。

app.controller('someController', function () {
  var ctrl = this; //self reference for this
  ctrl.myString = 'Some title';
});

请注意,即使我们仍然最终使用$scope,我们实际上并不需要提供$scope作为控制器的依赖项,也不需要直接与它进行交互。但是,如果我们需要使用$broadcast等高级服务,它仍然可用。

使用ControllerAs语法并不能消除$scope,因为控制器仍然是$scope的属性,但它确实允许你打破控制器和作用域之间的耦合,并且可以使您的HTML /控制器更易于阅读。拥有customerCtrl.namecompanyCtrl.name比拥有两个name属性更容易理解,这两个属性只能在周围元素的背景下理解。

不幸的是,绝大多数文档和教程仍然直接使用$scope对象,并且迁移到ControllerAs语法的速度很慢。但是,角度2中不存在$scope,从1.x迁移到2.x的第一步是转换为ControllerAs语法,所以如果你现在以这种方式编写代码,它将使它很容易迁移。

答案 2 :(得分:0)

控制器中可能存在不在$ scope范围内的方法(可能您将使用它们作为将从$ scope方法调用的辅助方法)。通常,您希望调用我的视图或需要绑定到视图的变量的方法保存在$ scope中。