我试图弄清楚如何在数组中的每个元素上设置一个$scope.$watch
。我只关心每个元素的某些属性。
在我的示例中,每个rental_date
对象都有三个属性:date
、start_time
和stop_time
。每当start_time
被更改时,我希望stop_time
设置为start_time
之后的2小时。
$ngResource
调用(使用角1.1.5):
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:
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:
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:
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:
这是可行的,但目前,我想不出一个优雅的解决方案,只访问我关心的$watch
ing而不是整个数组的值。
$scope.$watch 'rental_dates', ((newval, oldval) ->
$log.info 'watch changed'
$log.info newval
$log.info oldval
), true
有没有人在自己的项目中做过类似的事情?
发布于 2013-08-07 15:24:36
我假设您正在以某种方式使用ng-重复为数组的每个条目生成UI元素?为这些UI元素分配一个ng控制器。控制器将被实例化为每个数组元素。在控制器内部,使用$watch。
<div ng-repeat="rentalDate in rental_dates" ng-controller="RentalDateController">
</div>
然后在控制器代码中:
angular.module(...).controller('RentalDateController', function ($scope) {
$scope.$watch('rentalDate.start_time', function (startTime) {
...
});
});
下面是一个小例子:http://plnkr.co/edit/lhJ3MbULmahzdehCxVeM?p=preview
发布于 2013-08-07 15:08:56
我认为,如果将第一个$watch
参数改为:'rental_dates['+pos+'].start_time'
($watch将角表达式作为第一个参数,而pos不属于您的作用域),则解决方案3号将有效。
(虽然这应该有效,但我认为这样做不会很有效率。也许您应该同时更新start_time和stop_time,而不是监视所有启动时间的变化。)
发布于 2015-11-19 10:55:08
如果您想监视集合的一部分对象中的特定字段,并且通过ng-重复在视图中迭代集合的项,如果要查看的字段绑定到可以进行ng更改的控件,则始终可以使用ng-change处理程序处理监视方面。例:
<div ng-repeat="binding in bindings track by $index">
<input ng-model="binding" ng-change="changed(binding)">
</div>
在js中:
scope.changed = function(binding){
.....
}
https://stackoverflow.com/questions/18106649
复制相似问题