有谁知道如何设置映射选项以使头节点成为可观察的?
例如,如果我的结构如下:
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调用之后必须把所有这些都放在
上是非常痛苦的任何提示?想法?思考?我怎样才能做到这一点?
谢谢!
答案 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 ...