引用已命名/未命名控制器中的角度控制器成员
Referencing Angular controller members from named / unnamed controllers
我决定提出这个问题,因为我对Angular和JavaScript中更微妙的部分的工作方式感到非常困惑。我试着把我的问题具体化,以便把它分解。
-
从控制器公开变量的标准方法是在
$scope
上声明它们。.controller('MyCtrl', function($scope) { $scope.value = 5; });
然后,从模板引用来看,假设
MyCtrl
是控制器,它是这样的:{{value}}
当我使用controllerAs语法时,例如
ui-router
,如下所示:state('mystate', { templateUrl: 'partials/some.html', controller: 'MyCtrl as ctrl' }
我仍然可以用
{{value}}
获得value
,所以这是有效的。然而,如果我这样声明另一个值:.controller('MyCtrl', function($scope) { $scope.value = 5; this.otherValue = 10; });
然后使用
controller: 'MyCtrl'
语法,我可以而不是引用{{otherValue}}
。然而,对于controller: 'MyCtrl as ctrl'
语法,我可以这样引用它们:{{value}} {{ctrl.otherValue}}
第1点的摘要:我总是可以像
{{value}}
一样引用value
,但如果控制器已命名,则只能引用otherValue
,因此为{{ctrl.otherValue}}
。 -
我的第二点是关于函数的,主题与第1点类似。假设我定义了两个函数:
.controller('MyCtrl', function($scope) { $scope.myFunc = function() {}; this.otherFunc = function () {}; });
现在,如果我再次如上所述使用
controller: 'MyCtrl'
语法,那么从模板中我可以调用myFunc
:<button ng-click="myFunc()">
但这将无效:
<button ng-click="otherFunc()">
现在使用
controller: 'MyCtrl as ctrl'
语法,像这样调用myFunc
将不起作用:<button ng-click="ctrl.myFunc()"> <button ng-click="myFunc()">
但我可以通过引用名称为的控制器来调用
otherFunc
<button ng-click="ctrl.otherFunc()">
第2点总结:我只能像不使用controllerAs语法时那样调用
$scope.
函数,并且只能在引用命名控制器时调用this.
函数。这与点1形成对比,在这里我可以引用来自命名或未命名控制器定义的$scope.
变量。
我知道控制器构造函数用于设置$scope
,模板应该使用$scope
,但命名控制器有什么不同?我猜controllerAs语法导致自定义名称指向的不是作用域,而是控制器函数本身,但如果有人能帮我澄清这一点,我将不胜感激。
我还认为这些行为不仅与ui路由器有关,而且通常是它的工作方式,所以我也想知道:
$scope
上应该设置什么,不应该设置什么- 函数本身应该设置什么(?),不应该设置什么
- 使用命名控制器时,是否有访问
$scope.
功能的方法 - 有什么建议或我遗漏的要点吗
感谢您提前抽出时间。
$scope
和控制器是两个不同的对象。(Angular中的控制器函数实际上是一个对象的Javascript构造函数,使用this
可以正常访问该对象。)因此,将某些东西放在$scope
-$scope.value = "xxx"
-中与将某些东西放入this
-this.otherValue = "yyy"
中完全不同。Angular中的规则是$scope
是可以从视图模板(即HTML)访问的,因此$scope
下的任何内容都可以通过{{value}}
表示法和模板表达式直接访问。
总之:您不能从模板访问控制器的成员,就像您不能访问窗口对象(或$http
服务,或$q
,…,等等)的成员一样,因为这些对象与$scope
完全不同。从视图中只能访问$scope
的成员。
命名控制器做一件简单的事情:控制器被放置在给定名称下的$scope
中。因此,控制器是可访问的,例如作为{{ctrl}}
,并且其成员可访问作为{{ctrl.otherValue}}
。(为了明确某些事情:在控制器中执行this.otherValue = "yyy"
会使otherValue
成为控制器的成员。)
我希望这能回答问题(1)和(2)。其余:
$scope
上应该设置什么,不应该设置什么?
在$scope
中放置需要从视图访问的内容。
函数本身应该设置什么(?),不应该设置什么?
我不知道你说的是什么意思。如果您的意思是控制器中的this.xxx = "yyy"
,则不会将xxx
放置在函数中,而是放置在函数(this
)构建的对象中。
使用命名控制器时,是否有访问
$scope.
功能的方法?
您可以随时访问$scope
成员(无论是否具有功能)。不要混淆:在上面的示例中,即$scope.myFunc = function() {}; this.otherFunc = function () {};
,myFunc
是$scope
对象的成员,而不是控制器,因此无法将其作为ctrl.myFunc()
进行访问。
有什么建议或我遗漏的要点吗?
在简单的情况下,并不清楚控制器实际上是一个用new
调用的构造函数,并创建一个新对象。这在协作指令中非常有用,其中一个指令可以require
它协作的另一个指令的控制器,并调用控制器成员函数。
- 在指令控制器中使用$attrs时出现问题
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 从控制器返回后Ajax启动事件激发
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 如何在单击复选框后调用控制器方法
- 在控制器和数据对象之间同步数据
- 将Javascript数组发送到控制器ASP.NET MVC
- 角度控制器结构
- 如何在Jquery中发布后将值从视图返回到控制器
- 将值从html传递到AngularJS控制器
- 从我的控制器返回一个不同于200的代码以触发ajax错误,这被认为是一种好的做法吗
- 从控制器继承了隔离的作用域以生成可重用的指令
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 引用已命名/未命名控制器中的角度控制器成员
- 路由加载时运行成员控制器函数以设置控制复选框的属性
- 如何从成员控制器或组件观察把手模板中的多个状态
- 隔离作用域成员在链接/控制器内更新,但在传递给控制器时未定义
- 成员控制器:计算的属性不重新计算已注入的属性
- 用控制器包装成员数据模型的最佳方式
- 成员控制器中的数组变量