当前位置: 首页 > 面试题库 >

Angularjs“ Controller as”或“ $ scope”

冯流觞
2023-03-14
问题内容

我想知道angularjs中“ Controller as”或“ $ scope”语法之间的主要区别是什么。

  1. 它们是否会对性能产生影响,如果可以,则首选哪种语法。
  2. “控制器为”语法肯定会提高代码的可读性,因为Knockout.js和其他JavaScript框架遵循相同的语法。
  3. $ scope将提供范围继承,有时会给我们带来奇怪的行为,例如
<div ng-controller="firstController">
ParentController: <input type="text" ng-model="parent"/>
<div ng-controller="secondController">
ChildController: <input type="text" ng-model="parent" />
</div>
</div>

app.controller('ParentController', function ($scope) {
$scope.parent = "parentScope";
}).controller('ChildController', function ($scope) { /*empty*/ }); 

a)最初child将获得parent属性,并且在我们更新父级时显示“
parentScope”,child也将得到更新。但是,如果我们现在更改了child属性,则更新父级不会修改child,因为它拥有自己的scope属性。

b)如果我将控制器用作语法更改子节点,则也会更新父节点。


问题答案:

过去,我已经为这个问题写了一些答案,它们基本上都归结为同一件事。在Angular中$scope,即使没有明确引用它,也正在使用。

ControllerAs语法允许Angular帮助您编写更高效,更容错的控制器。在幕后,当您使用ng-controller="theController as ctrl"Angular
theController$scope,将在上创建为属性,并将其分配为ctrl。现在,您有了要从作用域引用的对象属性,并且可以自动免受原型继承问题的影响。

从性能的角度来看,由于您仍在使用$scope,因此几乎没有性能差异。但是,由于您的控制器现在不再$scope自己直接分配变量,因此不需要$scope注入。而且,由于现在它只是一个普通的JavaScript函数,因此可以更容易地对控制器进行隔离测试。

从前瞻性角度来看,现在众所周知Angular 2.0尚不具备$scope,但将使用ECMAScript
6的功能。在Angular团队发布的任何显示迁移的预览中,它们首先都是通过重构控制器来消除的$scope。如果您的代码是在不使用$scope基础控制器的情况下设计的,那么迁移的第一步已经完成。

从设计者的角度来看,ControllerAs语法使在对象的操作位置更加清晰。拥有customerCtrl.AddressstoreCtrl.Address使您更容易识别出您有一个由多个不同的控制器为不同目的分配的地址,这要比两者都使用时要容易$scope.Address。在页面上具有两个不同的HTML元素,这两个HTML元素都已绑定{{Address}}并知道哪个元素仅由控制器包含在其中,这是解决问题的主要麻烦。

最终,除非您尝试启动一个10分钟的演示,否则您真的应该使用ControllerA进行任何严肃的Angular工作。



 类似资料:
  • 问题内容: 例如,请参见此处:http : //www.johnpapa.net/angularjss-controller-as-and-the-vm- variable/ 就像标题所暗示的那样,我将按照本教程 [http://tech.pro/tutorial/1473/getting-started-with- angularjs-unit-testing] 进行单元测试,事实证明一切都很好

  • 问题内容: 当我编写手表处理函数时,我会在和上检查newVal参数。为什么AngularJS具有这种行为,却没有特定的实用程序方法?所以有但没有。手动实现并不难,但是如何扩展角度以在每个控制器中具有该功能?Tnx。 编辑 : 这个例子: 处理这种方法是否普遍接受? 编辑2 : JSFiddle示例(http://jsfiddle.net/ubA9r/): 问题答案: 您始终可以为您的应用程序完全添

  • 问题内容: 我正在使用controllerAs语法来避免控制器中的$ scope汤,并且还使用ui.bootstrap来呈现模式视图。 我需要打开一个与当前控制器共享相同作用域的modalInstace。注入示波器时,您可能会执行以下操作: 但是,由于我没有注入作用域,而是使用controllerAs语法,因此无法正常工作。 根据我的发现,您将需要使用resolve来传递数据,但是必须通过函数显式

  • 问题内容: 我想使用timeago插件使日期看起来更好。问题在于这些日期是通过AngularJS从REST动态获取的。因此,当我将此jQuery插件附加到我的页面时,它只是不对其进行处理。 那么,如何更好地做这样的事情呢?如果可能的话,我很乐意完全不使用jQuery。 问题答案: 我会使用momentjs- http : //momentjs.com/- 它没有依赖关系。 然后,您可以创建一个名为

  • 问题内容: 运行期间是否可以注入示波器或控制器?或任何其他建议将服务动态注入控制器? 提前致谢 问题答案: 可以使用$ injector 将服务动态(按名称)注入到控制器中。能够通过控制器参数注入服务只是Angular提供的一种便利。在后台,Angular使用$ injector来检索对象实例。但是我们也可以自己使用$ injector。 小提琴。

  • 问题内容: 什么时候应该使用角度函数,什么时候应该使用angularjs指令?对我来说,他们都可以做同样的事情。 两者之间是否有差异或使用方式? 问题答案: 显然,它们并不相同。一种仅在控制器中使用;另一种仅用于控制器。另一个是对输入元素的指令。 但是即使在它们的应用中,它们也有所不同。 使用监视的表达式时,将在每个摘要循环上对其进行评估,如果有更改,则将调用处理程序。 使用,响应事件,显式调用处