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

Do all methods in Angular controllers have to be on `$scope`?

本文关键字:scope 上吗 控制器 有方法 Angular      更新时间:2023-09-26

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

有人可以为我澄清这一点吗?

错。部件和指令中表达式可用的函数应分配给$scope对象。

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

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

由于$scope的原型性质,以及给定页面上可能存在多个范围的事实,因此通常建议在处理$scope时遵循"点规则"。 从本质上讲,点规则只是建议不要将原语分配给$scope,例如 $scope.myString,总是最好"使用点",或者将对象分配给$scope,就像$scope.someObject.myString一样。

从角度 1.2 开始,引入了一种新的语法,旨在帮助完成此任务,即 ControllerAs 语法。 从本质上讲,它允许您使用类似 ng-controller = "someController as ctrl" 之类的语法将控制器(已经是一个对象(直接分配给$scope,然后将所有绑定称为控制器的属性,就像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 语法的速度很慢。 但是,$scope在 angular 2 中不存在,从 1.x 迁移到 2.x 的第一步是转换为 ControllerAs 语法,所以如果你现在以这种方式编写代码,迁移将变得微不足道。

控制器

中也可以有不在$scope中的方法(可能是您将将它们用作从$scope方法调用的辅助方法(。通常,您想要调用我的视图的方法或需要绑定到视图的变量都保存在$scope中。