2
基於KnockoutJS映射documentation我試圖做的似乎很直接,但我沒有得到我期望的結果。KnockoutJS映射插件與複雜的對象
因此,對於一些簡單的測試HTML的
<div data-bind="with: rootItem">
<p data-bind="text: subProperty"></p>
<div data-bind="with: subObject">
<p data-bind="text: subSubProperty"></p>
</div>
和這個簡單的視圖模型和應用
var vm = function(){
this.rootItem = ko.observable();
this.loadData = function(data){
//map the rootObject here
ko.mapping.fromJS(data,{},this.rootItem());
//this.rootItem is undefined
console.log(this.rootItem());
};
};
//create new viewmodel
var myVM = new vm();
//create some dummy data with nested objects and properties
var data = {
subProperty: "Top Level Property",
subObject: {
subSubProperty:"Sub Level Property",
},
};
//load the data
myVM.loadData(data);
//apply the vm
ko.applyBindings(myVM);
所以vm.rootObject永遠不會被設置。我錯過了關於ko.mapping插件行爲的一些信息嗎?
loadData函數的這種實現可以獲得所需的結果,但會添加額外的步驟。
this.loadData = function(data){
//map the rootObject here
this.rootItem(ko.mapping.fromJS(data));
//this.rootItem is an object with a nested object and observable properties
console.log(this.rootItem());
};
爲什麼第一種方法失敗?在文檔中,它非常清楚地表明「ko.mapping.fromJS的第三個參數表示目標。」
這裏是一個fiddle展示正在發生的事情。
謝謝,現在有道理。有趣的是,當你使用with:binding來獲得你想要的行爲時,observable必須是未定義的。如果您預先加載了一個空對象,那麼with with binding會嘗試解析這些子對象,並且綁定失敗。但是,如果您從一個未定義的對象開始並使用someObject(ko.mapping.fromJS(data))此方法,則該行爲將按照預期使用with binding – thebringking