AngularJS在对象数组中观察对象属性

Coy*_*ero 51 javascript angularjs

data在控制器中有这个

    $scope.data = {
        home: {
            baseValue: "1",
            name: "home"
        },
        contact: {
            baseValue: "2",
            name: "contract"
        }
     // a lot more options
    };
Run Code Online (Sandbox Code Playgroud)

有一些像这样的HTML:

<section class="content row" ng-repeat="item in data">
   {{item.name}}
   ....
</section>
Run Code Online (Sandbox Code Playgroud)

现在,我想知道什么时候发生了baseValue变化,但由于我在数据变量中使用了一个对象,我不能watch以更简单的方式使用该属性.

我尝试过类似的东西,但我必须循环所有数组

$scope.$watch('data', function (newValue, oldValue, scope) {
 // some code to compare the tow arrays, line by line
}, true);
Run Code Online (Sandbox Code Playgroud)

我怎样才能更简单$watch地知道什么时候baseValue改变了?

类似的问题:

更新 1

我可以为每个对象添加一个单独的监视器,以便知道何时baseValue更改,但如果我有n多个对象,不仅仅是像这个示例中的几个对象那样也不会很好

$scope.$watch('data.home', function (newValue, oldValue, scope) {
 // do some stuff with newvalue.baseValue
}, true);

$scope.$watch('data.contact', function (newValue, oldValue, scope) {
 // do some stuff with newvalue.baseValue
}, true);
... // Adds more individual `watch`
Run Code Online (Sandbox Code Playgroud)

hut*_*ung 35

根据您的问题,您可以使用ngChange来观察更改baseValue并触发该功能.

HTML

<section class="content row" ng-repeat="item in data">
    Name: {{item.name}} <br/>
    BaseValue: <input type="text" ng-model="item.baseValue" ng-change="baseValueChange(item.baseValue)"/>
</section>
Run Code Online (Sandbox Code Playgroud)

调节器

$scope.baseValueChange = function(baseValue) {
    console.log("base value change", baseValue);
}
Run Code Online (Sandbox Code Playgroud)

如果你是一个更复杂的版本,可以获得oldValue和newValue,你可以参考这个plunkr - http://plnkr.co/edit/hqWRG13gzT9H5hxmOIkO?p=preview

HTML

<section class="content row" ng-repeat="item in data">
    Name: {{item.name}} <br/>
    BaseValue: <input type="text" ng-init="item.oldBaseValue = item.baseValue" ng-model="item.baseValue" ng-change="baseValueChange(item.oldBaseValue, item.baseValue); item.oldBaseValue = item.baseValue"/>
</section>
Run Code Online (Sandbox Code Playgroud)

调节器

$scope.baseValueChange = function(oldVal, newVal) {
    console.log("base value change", oldVal, newVal);
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*ska 15

您可以观看对象属性.
所以你可以做点什么

for(var key in $scope.data) {
  if($scope.data.hasOwnProperty(key)) {
    $scope.$watch("data['" + key + "'].baseValue", function(val, oldVal) {
      // Do stuff
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

没有经过测试,但想法很简单.

  • 只是为了安全起见,我会做 `"data[" + JSON.stringify(key) + "].baseValue"` 而不是 `"data['" + key + "'].baseValue"` (2认同)

sva*_*rog 6

在这种情况下,无法避免使用多个$watchCollection监视,另一种方法是利用监视对象值的数组,您可以使用该Object.values函数获取该数组。

scope.$watchCollection(function() {
    return Object.values(obj);
}, function(newValues, oldValues) {
    // now you are watching all the values for changes!
    // if you want to fire a callback with the object as an argument:
    if (angular.isFunction(scope.callback())) {
        scope.callback()(obj);
    }
});
Run Code Online (Sandbox Code Playgroud)