【问题标题】:ko.mapping, how listening change property of object?ko.mapping,如何监听改变对象的属性?
【发布时间】:2012-07-08 01:38:47
【问题描述】:

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

    $(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 做,但是我有很多属性,不会做。

如果状态改变,控制台的这个示例输出只有“状态”,但如果属性“名称”改变,则什么也不做。

对不起,我的英语不好。

【问题讨论】:

  • 您想如何知道属性是否已更改?尝试在这里查看“显式订阅可观察对象”部分KO docs 无论如何 ko.mapping 将所有属性转换为可观察对象,因此您不必先声明数据。
  • 我知道做ko.mapping,你是对的。我有一个对象 Data = {very much property},如果有任何属性被更改,我不会收到更改事件。只有它。我可以制作 ko.computed 并在其中制作对象的每个属性,但这并不优雅。
  • 可能你没有仔细看我之前评论的链接但是你可以使用这个功能:myViewModel.personName.subscribe(function(newValue) { alert("The person's new name is " + newValue); });但是你必须为每个属性都这样做......
  • 对不起,'订阅'总比没有好。现在,我没有举例说明“订阅”如何与“ko.mapping”一起使用。但我会探索它。并将添加有关结果的帖子。思考。

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

可能我的解决方案不是最合适或最优雅的方法,但是,如果您在计算变量中评估可观察对象,则每次变量更改时都会调用它。例如:

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.防止多次循环。 (每次变量更改时都会循环。您可以放置​​一个计数器来执行一次。)

【讨论】:

  • 认为,代码工作正常。如果找不到其他解决方案,将使用它。
猜你喜欢
  • 2015-02-12
  • 2017-05-16
  • 2013-10-23
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多