【问题标题】:Knockout update model with ko.mapping not working with computed fields带有 ko.mapping 的淘汰赛更新模型不适用于计算字段
【发布时间】:2012-09-04 05:32:56
【问题描述】:

似乎如果计算字段的属性“所有者”设置为视图模型的子元素,则使用 ko.mapping 更新 ViewModel 会删除计算值。

就像在这种情况下,我们有一个父母数组(每个父母都有一些子元素),我们希望每个父母都有一个计算字段来显示孩子的年龄总和。

当我们第一次应用 ViewModel 时一切正常,但如果我们在创建计算字段后重新应用映射,它们就会被删除。

<div data-bind="foreach: parent">

    <div class="cell"><span class="" data-bind="text : $data.comp"></span></div>
</div>
<span data-dind="text: comp"></span>
<script type="text/ecmascript">

    var viewModelJs = { 'parent': [{ 'name': 'pippo', 'childAge': [{ 'age': 15 }, { 'age': 18 }] }, { 'name': 'pluto', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };


    var viewModel = ko.mapping.fromJS(viewModelJs);

    for (var index in viewModel.parent()) {
        var parent = viewModel.parent()[index];
        parent.comp = ko.computed(
            {
                read: function () {
                    var parent = this;
                    var sum = 0;
                    for (var j in parent.childAge()) {
                        var age = parent.childAge()[j].age();
                        sum += parseInt(age);
                    }
                    return sum;
                },
                owner: parent
            });
    };

    ko.applyBindings(viewModel);

    viewModelJs = { 'parent': [{ 'name': 'paperino', 'childAge': [{ 'age': 5 }, { 'age': 18 }] }, { 'name': 'mario', 'childAge': [{ 'age': 5 }, { 'age': 13 }] }] };

    //Everything works fine so far...

    ko.mapping.fromJS(viewModelJs, viewModel);

    //now the computed fields are gone.

</script>

有没有办法使用 ko.mapping 保存这些计算字段?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    如果属性 name 唯一标识数组中的一项,请尝试将您对函数 ko.mapping.fromJS 的第一次调用替换为:

    var mapping = {
        'parent': {
            key: function(data) {
                return ko.utils.unwrapObservable(data.name);
            }
        }
    };
    var viewModel = ko.mapping.fromJS(viewModelJs, mapping);
    

    并在第二个 viewModelJs 定义中使用相同的 name 值。

    jsbin

    【讨论】:

    • 感谢您的回答。我试过了,如果我只有 1 个嵌套元素,它可以正常工作。但是目前这个问题仍然困扰着我,因为我必须解开更深层次的 Observables。有什么建议吗?
    • 只是以同样的方式工作。请参阅此sample 2 级。
    • 好的.. 但我会有这样的东西:jsbin.com/ojabaf/7/edit 但没用......
    猜你喜欢
    • 2012-09-19
    • 2013-03-30
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2016-06-21
    • 2012-06-09
    相关资源
    最近更新 更多