ko.mapping,如何改变对象的属性?

时间:2012-07-08 08:35:17

标签: knockout.js knockout-mapping-plugin

如何获取下一个对象的更改事件?

    $(function () {
    var Data = {
        id: ko.observable(15),
        name: ko.observable('my name'),
        status: ko.observable('status')
    }

    var ClickCounterViewModel = function () {
        var me = this;
        me.Model = ko.observable(Data);

        me.change = ko.computed(function () {
            var m = me.Model();
            console.log(m.status());
        });
    };

    ko.applyBindings(new ClickCounterViewModel());
});

我从以下网站获取对象数据:

ko.mapping(AnyInitData, {}, Data);

模型将所有属性都视为可观察,但如果有任何值被更改,我想知道这一点。 它可以通过ko.computed完成,但我有很多属性,并且不会这样做。

如果状态已更改,此示例控制台仅输出'status',但如果更改了属性'name'则不执行任何操作。

对不起,我的英文。

1 个答案:

答案 0 :(得分:2)

可能我的解决方案不是最合适或最优雅的方式,但是,如果您在计算变量内部计算可观察量,则每次变量变化时都会调用它。例如:

me.change = ko.computed(function () {
        var m = me.Model();
        alert('something changed');
        m.id(),m.name(),m.status();
    });

如果你有很多属性,你可以遍历模型:

me.change = ko.computed(function () {
        var m = me.Model();
        alert('something changed');

        for (var key in me.Model()) {
            var obj = me.Model()[key]; 
             if( ko.isObservable(obj)){
                obj();                 
             }             
        }
    });

你也可以考虑 1.在Model内递归循环 2.多次阻止循环。 (它每次变量都会循环变化。你可以把计数器做一次。)