观察不同对象键的特定属性

时间:2017-09-21 09:08:20

标签: angularjs angularjs-scope

我有这个对象

vm.obj = {
    prop1: 1,
    prop2: 'test2',
    prop3: ['test 3'],
    hashes: {
        objToWatchOnePlusHash123: {
            watchThis: 'value 1',
            subOne: 1,
            subTwo: '2',
        },
        objToWatchTwoPlusHash456: {
            watchThis: 'value 2',
            subOne: 3,
            subTwo: '4',
        },
    },
};

我只想在每个watchThis中观看objToWatch*PlusHash*的值(这将是一个实际的哈希值,因此它将是独一无二的。)

目前,我使用

运行
$scope.$watch('vm.obj.hashes', function (newVal, oldVal) {
    /* */
}, true)

但它也会被每个对象中subOnesubTwo的更改触发。

可能只看我想看的东西?考虑到它们是两个具有不同键的对象。

2 个答案:

答案 0 :(得分:0)

在这个JSON中

vm.obj = {
    prop1: 1,
    prop2: 'test2',
    prop3: ['test 3'],
    hashes: {
        objToWatchOnePlusHash123: {
            watchThis: 'value 1',
            subOne: 1,
            subTwo: '2',
        },
        objToWatchTwoPlusHash456: {
            watchThis: 'value 2',
            subOne: 3,
            subTwo: '4',
        },
    },
};

在不知道watchThis属性的情况下,无法在所有对象中观看objToWatch***。您只能观看整个对象。

您可以做的一件事是,如果您当时能够获得哈希密钥。 (可能的解决方法)

然后

$scope.$watch('vm.obj.hashes', function (newVal, oldVal) {
    if(newVal[hash].watchThis !== oldVal[hash].watchThis){
    // do something
     }
}, true)

答案 1 :(得分:0)

是的,您可以观看不同对象键的特定属性。为了这个写 watch 函数,它将返回value - 所有监视属性的某种组合,在这种特殊情况下,它是具有相应属性的对象的JSON表示:



angular.module('app', []).controller('ctrl', ['$scope', function($scope) {
  var vm = this;
  
  vm.obj = {
    prop1: 1,
    prop2: 'test2',
    prop3: ['test 3'],
    hashes: {
        objToWatchOnePlusHash123: {
            watchThis: 'value 1',
            subOne: 1,
            subTwo: '2',
        },
        objToWatchTwoPlusHash456: {
            watchThis: 'value 2',
            subOne: 3,
            subTwo: '4',
        },
      },
  };
  
  $scope.$watch(function(){
    var value = {};
    for(var prop in vm.obj.hashes)
      if(prop.match(/^objToWatch\D+PlusHash\d+$/))
        value[prop] = vm.obj.hashes[prop].watchThis;      
    return JSON.stringify(value);
  }, function(newVal, oldVal){    
      console.log('OldVal:' + oldVal + '\n\rNewVal:' + newVal);
  })  
}])

<script src="//code.angularjs.org/snapshot/angular.min.js"></script>

<div ng-app='app' ng-controller="ctrl as vm">
  <div ng-repeat='(key, val) in vm.obj.hashes'>
    {{key}}.watchThis: <input type='text' ng-model='vm.obj.hashes[key].watchThis'>
  </div>   
  objToWatchTwoPlusHash456.subOne: <input type='text' ng-model='vm.obj.hashes.objToWatchTwoPlusHash456.subOne'>
</div>
&#13;
&#13;
&#13;