如何$观察对象的一个​​或两个属性?

时间:2013-12-18 21:52:03

标签: javascript angularjs

我正在尝试在我的模型上实现一个状态属性,使用$ watch在任何属性更改时标记模型脏:

        $scope.$watch(
            function (scope) {
                return scope.item;
            },
            function (newItem, oldItem) {
                if (newItem !== oldItem) {
                    newItem.setStateDirty();
                }
            });

(有点明显)问题是对state属性的任何更改也会触发监视。

如果没有显式比较所有属性以确定是否只有状态属性发生了变化,是否有可能忽略对state属性的更改?

2 个答案:

答案 0 :(得分:1)

$watch功能中,您可以返回一个新对象,其中包含item的所有属性,但您不想观看的属性除外。

$scope.$watch(
    function (scope) {
        // return a new object in which the dirty property is always undefined
        // and therefore will not trigger the watch
        return angular.extend({}, scope.item, {dirty: undefined});
    },
    function (newItem, oldItem) {
        if (newItem !== oldItem) {
            newItem.setStateDirty();
        }
    });

答案 1 :(得分:0)

我通过从不同的方向解决问题来解决这个问题。我现在使用object.defineProperty()定义模型属性,而不是为我的模型使用简单的JavaScript对象。这允许我在特定属性的setter中显式设置脏标志。

例如:

Object.defineProperty(this, "title",
    {
        set: function (value) {
                _title = value;
                this.dirty = true;
            }
    });