如何使用angularJS了解对象的已更改属性

时间:2017-08-15 19:45:29

标签: javascript angularjs

app.controller('indexController', ['$scope', 'authService', function ($scope, authService) {

    var vm = this;

    vm.$onInit = function () {
        vm.active = {
            "home": true,
            "welcome": false,
            "user": false,
            "logout": false,
            "login": false,
            "signup":false
        };
    };

    $scope.$watch('vm.active', function (newObj, oldObj) {
        // How to detect which property has changed ?
    }, true);

}]);

这种方式我试过,但我不知道如何在手表中检测到(在我的示例代码中显示),哪个属性已更改。

3 个答案:

答案 0 :(得分:2)

您可以运行其中一个对象的键,并按值对其进行过滤。 这样的事情:

const obj1 ={
    "home": true,
    "welcome": false,
    "user": false,
    "logout": false,
    "login": false,
    "signup":false
};

const obj2 = {
    "home": true,
    "welcome": false,
    "user": false,
    "logout": true,
    "login": true,
    "signup":false
};

const diff = Object.keys(obj1).filter((key) => obj1[key] !== obj2[key])

答案 1 :(得分:0)

const obj1 ={
    "home": true,
    "welcome": false,
    "user": false,
    "logout": false,
    "login": false,
    "signup":false
};

const obj2 = {
    "home": true,
    "welcome": false,
    "user": false,
    "logout": true,
    "login": true,
    "signup":false,
    "somethingNew": false
};


for (myProperty in obj2){
    if (obj2[myProperty] !== obj1[myProperty]){
        alert(myProperty + ' has changed!');
    }
}

我相信这应该使用for ... in循环。

答案 2 :(得分:0)

我认为观察者无法检测到并且属性发生了变化, 你可以使用watchGroup或watchCollection来制作技巧解决方案 (请参阅$ watchCollection将浅看单个对象上的属性,并在其中一个对象发生更改时通知您。

然而, $ watchGroup会观看一组单独的手表表达式。)

您也可以查看(how to know which object property changed?)。