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

Javascript 角度控制器中的所有方法都必须在“$scope”上吗?,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,我看到很多控制器除了这个作用域外没有其他成员。我可以想象,从未直接从绑定表达式访问过的共享验证和业务逻辑代码不需要知道非作用域代码,只有从视图访问的成员实际上必须在作用域上 有人能帮我澄清一下吗?没错。应将部分和指令中表达式可用的函数分配给$scope对象 你所有的其他逻辑都不必是。如果您计划在控制器之间重用任何逻辑,最好将其提取到工厂/服务中 没错。应将部分和指令中表达式可用的函数分配给$scope对象 你所有的其他逻辑都不必是。如果您计划在控制器之间重用任何逻辑,最好将其提取到工厂/服务中

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


有人能帮我澄清一下吗?

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


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

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


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

控制器中可能有不在$scope方法中的方法,也可能是您将它们用作从$scope方法调用的帮助器方法。通常,您想要调用my view或需要绑定到view的变量的方法保存在$scope中。

控制器中可能有不在$scope中的方法,也可能是您将它们用作从$scope方法调用的帮助器方法。通常,要调用my view或需要绑定到view的变量的方法保存在$scope中。

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

由于在一个给定的页面上可能存在多个作用域,通常建议在处理$scope时遵循Dot规则。本质上,点规则只是建议不要将原语分配给$scope,例如$scope.myString,而是最好使用点,或者将对象分配给$scope,即la$scope.someObject.myString

从angular 1.2开始,引入了一种新语法,即ControllerAs语法,旨在帮助完成此任务。本质上,它允许您将已经是对象的控制器直接分配给$scope,使用类似ng controller=someController的语法作为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.name和companyCtrl.name比拥有两个名称属性更容易理解,这两个属性只有在周围元素的上下文中才能真正理解

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

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

由于在一个给定的页面上可能存在多个作用域,通常建议在处理$scope时遵循Dot规则。本质上,点规则只是建议不要将原语分配给$scope,例如$scope.myString,而是最好使用点,或者将对象分配给$scope,即la$scope.someObject.myString

从angular 1.2开始,引入了一种新语法,即ControllerAs语法,旨在帮助完成此任务。本质上,它允许您将已经是对象的控制器直接分配给$scope,使用类似ng controller=someController的语法作为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.name和companyCtrl.name比拥有两个名称属性更容易理解,这两个属性只有在周围元素的上下文中才能真正理解


不幸的是,绝大多数文档和教程仍然直接使用$scope对象,并且迁移到ControllerAs语法的速度很慢。但是,$scope在angular 2中不存在,从1.x迁移到2.x的第一步是转换为ControllerAs语法,因此如果现在这样编写代码,迁移就变得很简单。

但是如果代码位于客户端,那么无论是否为angular,都可以访问。。实际上,并不是所有的方法都放在$scope上,它们可以嵌入$rootScope和服务中too@ShubhamNigam我不在乎代码是否可以访问,但让它访问是否是一种好的做法。在你的推理中,它甚至不是角度的,它只是JavaScript。@RohitKumar我指的是包含在角度控制器中的代码,而不是所有的角度代码。那么不,。。除非在$scope下定义,否则任何方法都不会对使用角度语法的视图产生影响。但如果代码位于客户端,则无论是否为角度,都可以访问。实际上,并非所有方法都放在$scope上,它们可以嵌入到$rootScope和服务中too@ShubhamNigam我不在乎代码是否可以访问,但是,让它访问与否是否是一种好的做法。在你的推理中,它甚至不是角度的,它只是JavaScript。@RohitKumar我指的是包含在角度控制器中的代码,而不是所有的角度代码。那么不,。。除非在$scope下定义,否则任何方法都不会对使用角度语法的视图产生影响。