首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对数组中的每个元素设置$scope.$watch

对数组中的每个元素设置$scope.$watch
EN

Stack Overflow用户
提问于 2013-08-07 14:51:09
回答 3查看 23.3K关注 0票数 13

我试图弄清楚如何在数组中的每个元素上设置一个$scope.$watch。我只关心每个元素的某些属性。

在我的示例中,每个rental_date对象都有三个属性:datestart_timestop_time。每当start_time被更改时,我希望stop_time设置为start_time之后的2小时。

$ngResource调用(使用角1.1.5):

代码语言:javascript
运行
复制
Agreement.show( 
  id: 5 
).$then ((success) ->
  $scope.agreement = success.data.agreement

  # returns an array of rental dates
  $scope.rental_dates = success.data.rental_dates

  # $watch goes here

下面是我尝试过的$watch函数的四个变体:

1:

代码语言:javascript
运行
复制
angular.forEach $scope.rental_dates, (date, pos) ->
  $scope.$watch date.start_time, ((newval, oldval) ->
    $log.info 'watch changed'
    $log.info newval
    $log.info oldval
  ), true

2:

代码语言:javascript
运行
复制
angular.forEach $scope.rental_dates, (date, pos) ->
  $scope.$watch $scope.rental_dates[pos].start_time, ((newval, oldval) ->
    $log.info 'watch changed'
    $log.info newval
    $log.info oldval
  ), true

3:

代码语言:javascript
运行
复制
angular.forEach $scope.rental_dates, (date, pos) ->
  $scope.$watch 'rental_dates[pos].start_time', ((newval, oldval) ->
    # also tried '$scope.rental_dates[pos].start_time'

    $log.info 'watch changed'
    $log.info newval
    $log.info oldval
  ), true

4:

这是可行的,但目前,我想不出一个优雅的解决方案,只访问我关心的$watching而不是整个数组的值。

代码语言:javascript
运行
复制
$scope.$watch 'rental_dates', ((newval, oldval) ->
  $log.info 'watch changed'
  $log.info newval
  $log.info oldval
), true

有没有人在自己的项目中做过类似的事情?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-07 15:24:36

我假设您正在以某种方式使用ng-重复为数组的每个条目生成UI元素?为这些UI元素分配一个ng控制器。控制器将被实例化为每个数组元素。在控制器内部,使用$watch。

代码语言:javascript
运行
复制
<div ng-repeat="rentalDate in rental_dates" ng-controller="RentalDateController">
</div>

然后在控制器代码中:

代码语言:javascript
运行
复制
angular.module(...).controller('RentalDateController', function ($scope) {
    $scope.$watch('rentalDate.start_time', function (startTime) {
        ...
    });
});

下面是一个小例子:http://plnkr.co/edit/lhJ3MbULmahzdehCxVeM?p=preview

票数 27
EN

Stack Overflow用户

发布于 2013-08-07 15:08:56

我认为,如果将第一个$watch参数改为:'rental_dates['+pos+'].start_time' ($watch将角表达式作为第一个参数,而pos不属于您的作用域),则解决方案3号将有效。

(虽然这应该有效,但我认为这样做不会很有效率。也许您应该同时更新start_time和stop_time,而不是监视所有启动时间的变化。)

票数 8
EN

Stack Overflow用户

发布于 2015-11-19 10:55:08

如果您想监视集合的一部分对象中的特定字段,并且通过ng-重复在视图中迭代集合的项,如果要查看的字段绑定到可以进行ng更改的控件,则始终可以使用ng-change处理程序处理监视方面。例:

代码语言:javascript
运行
复制
 <div ng-repeat="binding in bindings track by $index">
     <input ng-model="binding" ng-change="changed(binding)">
 </div>

在js中:

代码语言:javascript
运行
复制
 scope.changed = function(binding){
      .....
 }
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18106649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档