Angular Controller As Syntax-no method'$ watchCollection'

时间:2015-06-16 17:35:11

标签: angularjs angularjs-scope

我正在尝试在Angular中执行Controller As Syntax。在这一点上,我在我的routerProvider中拥有它...不确定它对我遇到的问题是否重要,但不管怎样它仍然存在:

 angular.module('ucp.kick', [
  'ngRoute'
])
.config ($routeProvider, APP_BASE_URL) ->
  $routeProvider
  .when APP_BASE_URL + 'kicks',
    name: 'Kicks'
    templateUrl: 'kick/partials/kick.html'
    controller: 'kick as KickController'

这是我的控制器的浓缩版本:

  this.$watchCollection('filtered.devices', function(devices) {
    return this.filteredDevices = devices;
  });

但我明白了:

TypeError: Object [object Object] has no method '$watchCollection'

我意识到当使用控制器作为语法时,您不希望注入范围。那么,我如何访问$watchCollection函数?

3 个答案:

答案 0 :(得分:5)

您仍然需要注入$scope才能使用$watch$watchCollection。现在,你会认为你可以这样做:

$scope.$watchCollection('filtered.devices', function (newVal, oldVal) {});

$scope.$watchCollection('this.filtered.devices', function (newVal, oldVal) {});

但这不起作用。所以你需要做:

var that = this;
$scope.$watchCollection(function () {
    return that.filtered.devices;
}, function (newVal, oldVal) {

});

或:

$scope.$watchCollection(angular.bind(this, function () {
    return this.filtered.devices;
}), function (newVal, oldVal) {

});

或:

$scope.$watchCollection("KickController.filtered.devices", function(newVal, oldVal) { });

答案 1 :(得分:1)

对于手表,您仍然需要使用$scope

$scope注入控制器后,就像controllerAs语法出现之前一样,您可以执行以下操作:$scope.$watchCollection(..)

进一步迭代我的意思:如果您尝试观看的值使用controllerAs语法绑定到某个值 - 例如kickController.someValue,那么您会看到该值{{1 }}

旁注:显示所有代码都会有所帮助,因为看起来你的控制器定义可能会倒退。你的意思是: $scope.$watchCollection('kickController.someValue',...)

然后:

... controller: KickController as kick

答案 2 :(得分:1)

controller as不会将控制器替换为$scope。控制器没有$watchCollection属性。您仍然必须注入$scope并使用$scope.$watchCollection 您必须使用控制器标识符作为要观看的集合的名称

$scope.$watchCollection("KickController.filtered.devices"

话虽这么说,通常可以避免使用$watch$watchCollection,您可以使用数据绑定。 Angular将在集合内部使用$watchCollection。具体来说,当您可以在现有集合上明确使用过滤器时,我不确定您是否需要此其他属性filteredDevices