Angular 控制器中的所有方法都必须在“$scope”上吗?
Do all methods in Angular controllers have to be on `$scope`?
我看到很多控制器除了这个范围之外没有成员。我可以想象从未直接从绑定表达式访问的共享验证和业务逻辑代码不需要知道非作用域代码,并且只有从视图访问的成员实际上必须在作用域上。
有人可以为我澄清这一点吗?
错。部件和指令中表达式可用的函数应分配给$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.name
和companyCtrl.name
比拥有两个只有在周围元素的上下文中才能真正理解的name
属性要容易得多。
遗憾的是,绝大多数文档和教程仍然直接使用 $scope
对象,并且迁移到 ControllerAs 语法的速度很慢。 但是,$scope
在 angular 2 中不存在,从 1.x 迁移到 2.x 的第一步是转换为 ControllerAs 语法,所以如果你现在以这种方式编写代码,迁移将变得微不足道。
中也可以有不在$scope中的方法(可能是您将将它们用作从$scope方法调用的辅助方法(。通常,您想要调用我的视图的方法或需要绑定到视图的变量都保存在$scope中。
- 为什么不'我的角度测试$scope上定义了方法
- 你能嵌套在点击事件上吗?
- 无法调用$scope上定义的函数
- 角度+打字稿:最终出现在$scope上的内容
- 从 $scope 上的函数访问控制器内的实例函数
- 从 AngularJS 中$scope上定义的另一个函数调用$scope上定义的函数
- 我可以使用 JavaScript 或任何其他技术根据用户输入将焦点切换到窗口或选项卡上吗?
- Angularjs基于存储在会话存储中并存储在$scope上的变量动态显示/隐藏元素
- 定义$scope上的所有函数
- 使用three.js,我可以将信息附加到对象上吗,比如URL
- 在$scope上定义的对象未定义
- 你能控制用Javascript创建的窗口显示在哪个显示器上吗
- 如何在Angular工厂中保留Scope上的数据
- 角度工厂:如何返回在$scope上操作的函数
- 有可能在angular中使用多个$scope变量吗?
- 我应该把我的依赖连接到我的Javascript库上吗?
- 我可以将事件监听器附加到画布事件上吗?
- 有什么方法可以添加可拖放组件到面板上吗?
- 你能让一个元素不使用css position:fixed而停留在滚动上吗?
- Angular 控制器中的所有方法都必须在“$scope”上吗?