Angular - 使用controllerAs、bindToController和$scope.$watch的指令

4
我有一个非常直观的AngularJS问题,但似乎找不到答案:
当同时使用controllerAs和bindToController选项时,如何在指令控制器中使用$scope.$watch()?
如果需要澄清我的意思,请告诉我。
1个回答

11

好的,$scope.$watch 监听 表达式,因此假设您将控制器绑定到名称 vm(例如 controllerAs: 'vm'),则应该使用

$scope.$watch('vm.somethingToWatch', function(newval, oldval) {...})

您仍需要注入$scope,因为单独的控制器实例上没有$watch可用。


为了正确注入 $scope,我需要使用 $injector 还是只需在控制器中包含它?(例如 controller: function($scope) { - Dean Zaslow
如果$scope.$watch函数在控制器内部使用this变量,我是否仍然会使用controllerAs名称(例如vm)? 即 var self = this; self.total = someCode; $scope.$watch('self.total', function()$scope.$watch('vm.total', function() - Dean Zaslow
当然可以,你可以像这样在控制器函数中注入它:function($scope)。对于后一个问题,表达式会像在模板内部一样进行评估,所以是 vm.total :) - ArtoAle
感谢您简明扼要的回答 - 非常感谢。 - Dean Zaslow
1
新手问题 - 这对我来说似乎很奇怪 - 我们将作用域绑定到控制器上。为了检测现在在控制器上的变量的更改,而不是“直接”进行更改,我们必须要求作用域监视更改吗?除了最初的bindToController之外,是否没有不涉及作用域的Angular方法可以做到这一点? - rinogo
我相信bindToController有两个主要原因:一是让类式控制器能够很好地工作,更重要的是始终保证在Angular模板中使用“.”,确保您不会遇到作用域继承方面的麻烦。这并不意味着处理作用域现在被延迟到了控制器,所有特定于作用域的方法仍然只能通过它来访问(例如scope.$applyscope.$watchscope.$broadcastscope.$on等)。 - ArtoAle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接