纯控制器对象

时间:2016-03-16 09:02:41

标签: angularjs angularjs-controller

在AngularJS中,由 Javascript构造函数定义的Controller itself is an object,此构造函数是callback to .controller方法。

var myapp=angular.module('scopeExample', []);
myapp.controller('MyController',function MyController($scope){
  $scope.name="john";
  this.num=700;
}); 

在上面的示例中, MyController 是构造函数,它使用一个属性(num)创建 Controller对象。我有三个问题:

  • 实际上,在这种情况下Controller对象的用途是什么?
  • 是否有更多属性不可见,是否可以从Angular外部访问?
  • 它是如何与其范围相互联系的又是另一个对象?

我遇到了以下问题,因为控制器为语法创建了一个控制器对象,该控制器对象是控制器范围的属性,因此可以轻松访问,例如

<div ng-app="scopeExample" ng-controller="MyController as ctrl">
    <input id="box" ng-model="ctrl.num"> equals {{ ctrl.num }}   
</div>

<script> 
angular.module('scopeExample', [])
.controller('MyController', [function () {
     this.num=12;
}]);
</script>     

var x=angular.element('#box').scope().ctrl;    //x is the controller object itself

1 个答案:

答案 0 :(得分:1)

1.A。 在这种情况下Controller对象的用途是什么?

这个例子没有什么特别之处,angular是一个MVC框架(或者你想要使用的任何其他流行语来描述几乎相同的东西),控制器的职责是响应视图事件,相应地更新模型并执行业务逻辑任务(您可以选择实际实现逻辑的位置,控制器本身或使用服务)。

当然,在这个例子中,控制器是没用的,因为你没有逻辑,只有2个礼节。

1.B。选择ctrl-as语法,在你的例子中,当你使用控制器时,你将'scope'注入到控制器并添加了属性($ scope.name),因为建议你避免使用scope,除非你有义务做所以。 (例如$ watch,parent ......)

2.A。 是否还有一些不可见的属性?

不,它没有任何不可见的属性,您可以使用以下代码轻松地检查它:

.controller('MyController', function () { window.DoesThisControllerHaveInvisibleProps = this; });

2.b中。 是否可以从Angular外部访问?

我不确定我是否完全理解你在“Angular”之外的意思,如果是这样的话,可以从“外部”访问控制器obj:

class MyController {
    static foo() {
        console.log('hello!');
    }
}

myapp.controller('MyController', MyController);
// maybe somewhere else in that module
MyController.foo();

3. 它如何与其范围互连,而范围又是另一个对象?

正如您所说,当使用控制器作为语法时,angular正在初始化控制器并将其放在$ scope上,以便可以在模板中访问它。

$ scope只是一种不必要的光晕,你应该避免使用它。我看待它的方式就像角度植入细节一样,当迁移到ng-2时,你会看到没有更多的范围。

如果您对更详细的信息感兴趣,有关角度范围内的美元范围和控制器是如何工作的,我建议您have a look at