knockout mapping plugin,也为头节点创建observable

时间:2014-03-20 19:53:19

标签: knockout.js knockout-mapping-plugin

有谁知道如何设置映射选项以使头节点成为可观察的?

例如,如果我的结构如下:

var myModel = {
table: [{...},{...},{...}]
configOptions: { someoptions... }
otherstuff: thisbecomesanobservable
}

我打电话

var data = ko.mapping.fromJS(myModel)

由于某种原因,data不是可观察的,只有叶子。 这意味着我以后打电话

ko.mapping.fromJS(ajaxResponse, {}, data);

我需要对数据进行订阅和依赖,我不能,因为它不可观察。

我现在正在这样做以手动包裹它:

if (typeof vm.Table === 'undefined') {
    vm.Table = ko.observable();
    vm.Table(ko.mapping.fromJS(response.Model));
}
else {
    var temp = vm.Table();
    ko.mapping.fromJS(response.Model, {}, temp);
    vm.Table(temp); 
}

但是在每次ajax调用之后必须把所有这些都放在

上是非常痛苦的

任何提示?想法?思考?我怎样才能做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

我尝试重建你正在做的事情(我冒昧地将你的data变量重命名为vm,因为这确实是你的视图模型):

<强>标记:

<ul data-bind="foreach: table">
    <li data-bind="text: someProperty"></li>
</ul>

<label>Hax option value:</label>
<label data-bind="text: configOptions.hax"></label>

<input type="button" data-bind="click: doAjaxCall" value="Get new stuff" />

<强>脚本:

<script>
    var initialModel = {
        table: [{ someProperty: 1 }, { someProperty: 2 }],
        configOptions: { hax: '2tm' },
    };

    $(document).ready(function() {

        var vm = ko.mapping.fromJS(initialModel);

        //Attach a function to viewmodel before binding
        vm.doAjaxCall = function(dataVal, event)
        {
            //A Json object, we pretend, this came back from an AJAX call.
            //Obviously, it should have same layout as initial object, base for the viewmodel.
            var newData = {
                table: [{ someProperty: 3 }, { someProperty: 4 }, { someProperty: 5 }],
                configOptions: { hax: '4tm' },
            };

            //Update viewmodel with the new data
            ko.mapping.fromJS(newData, vm);
        };

        //Init knockout
        ko.applyBindings(vm);
    });
</script>

单击按钮,您应该看到vm得到更新,冒泡并更新数据绑定对象。

是这样的吗?如果您有类似的代码,但无法使用,请提供jsfiddle等。


答案 1 :(得分:0)

如果这有助于某人,当您从服务器及其复杂对象获取数据时,这是如何将其包装在一个可观察的对象中:

vm.updateModel = function (observable, data) {
    if (observable() == undefined)
        observable(ko.mapping.fromJS(data));
    else {
        var temp = observable();
        ko.mapping.fromJS(data, {}, temp);
        observable(temp);
    }
};

令人震惊的是,映射插件默认情况下无法执行此操作或使用mappingOptions ...