【问题标题】:overriding a JSON property to be computed覆盖要计算的 JSON 属性
【发布时间】:2013-12-12 02:53:26
【问题描述】:

我是 knockout.js 的新手,如果这是一个非常简单的问题,请原谅。

我从已包含需要计算的属性的 Web 服务获取 JSON 数据。类似的东西

{
    ValueA: 1,
    ValueB: 3,
    SumOfValues: 0
}

SumofValues 必须是 ValueA 和 ValueB 的总和。我想使用映射插件来创建我的视图模型,但覆盖 SumOfValues 的创建以便计算它。当 Viewmodel 转换回 JSON 数据(用于回发到 Web 服务)时,我希望 SumOfValues 包含正确的总和。

我在这个jsfiddle 中工作得很好,唯一的问题是当我更改其中一个文本框中的值时 SumofValues 属性没有更新。我认为这个值会自动依赖于 ValueA 和 ValueB,因为我在函数中引用了它们。

谢谢

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    您需要更改 SumOfValues 的映射以创建计算值而不是可观察值。这是一个更新的小提琴:

    http://jsfiddle.net/38MwU/11/

    和代码:

    var json = {
    "ValueA": 9,
    "ValueB": 1,
    "SumOfValues": 0
    };
    
    function myViewModel(data) {
    var self = this;
    
    var mapping = {
        'SumOfValues': {
            create: function (options) {
                return ko.computed( function() {
                    return (parseInt( self.ValueA() ) + parseInt( self.ValueB() ) );
                });
            }            
        }
    };
    
    ko.mapping.fromJS(data, mapping, self);
    
    self.isValid = ko.computed(function () {
        return (self.SumOfValues() == self.ValueA() + self.ValueB() ? "equal" : "not equal");
    });
    }
    
    ko.applyBindings(new myViewModel(json));
    

    【讨论】:

      【解决方案2】:

      计算后的 observable 是开箱即用的只读数据。如果你想更新计算的 observable,你需要修改它以支持读/写。 Look at the writeable section 在淘汰赛文档中了解详细信息。他们直接实施。如果你需要一个小提琴样本,请告诉我,但这应该可以帮助你完成你想要的

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 2013-03-22
        • 2016-03-07
        • 2019-08-09
        • 2017-12-14
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多