覆盖要计算的JSON属性

时间:2013-12-12 02:53:26

标签: knockout.js knockout-mapping-plugin

我是kickout.js的新品牌,如果这是一个简单易懂的问题,请原谅。

我从已经包含需要计算的属性的Web服务获取JSON数据。像

这样的东西
{
    ValueA: 1,
    ValueB: 3,
    SumOfValues: 0
}

SumofValues需要是ValueA和ValueB的总和。我想使用映射插件来创建我的viewmodel,但是重写SumOfValues的创建以便计算它。当Viewmodel转换回JSON数据(用于回发到Web服务)时,我希望SumOfValues包含正确的总和。

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

感谢

2 个答案:

答案 0 :(得分:3)

您需要更改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));

答案 1 :(得分:0)

计算的可观察量只能开箱即用。如果要更新计算的observable,则需要对其进行修改以支持读/写。详情请参阅淘汰文档中的Look at the writeable section。他们很容易实施。如果你需要一个样本小提琴告诉我,但这应该可以帮助你完成你想要的事情