我有一个敲除映射的问题。我使用击倒映射插件来表示在JSON中序列化的表单。它在使用击倒映射之前工作,但我需要使用击倒映射,因为我希望我的属性是可观察的。
你可以在这里看到工作的html: http://jsfiddle.net/etiennenoel/wG9SZ
这是我不工作的javascript代码:
var formData =
{"data":
[
{
"groupName" : "Properties",
"content" :
[
{
"title" : "Calculation Method",
"formType" : "select",
"value" :
[
{
"title" : "Voltage Drop - Unbalanced",
"selected" : true
},
{
"title" : "Voltage Drop - Balanced"
}
]
},
{
"title" : "Tolerance (% V)",
"formType" : "textBox",
"value" : 0.01
},
{
"title" : "Calculation Options",
"formType" : "radio",
"value" :
[
{
"title" : "Flat Start (at Nominal Conditions",
"checked" : false
} ,
{
"title" : "Assume Line Transposition",
"checked" : true
}
]
},
{
"title" : "Adjust Conductor Resistance at",
"formType" : "textBox",
"disabled" : true,
"value" : 77,
"appendLabel" : true,
"appendLabelText" : "°F"
}
]
},
{
"groupName" : "Properties",
"content" :
[
{
"title" : "Calculation Method",
"formType" : "select",
"value" :
[
{
"title" : "Voltage Drop - Unbalanced",
"selected" : true
},
{
"title" : "Voltage Drop - Balanced"
}
]
},
{
"title" : "Tolerance (% V)",
"formType" : "textBox",
"value" : 0.01
},
{
"title" : "Calculation Options",
"formType" : "radio",
"value" :
[
{
"title" : "Flat Start (at Nominal Conditions",
"checked" : false
} ,
{
"title" : "Assume Line Transposition",
"checked" : true
}
]
},
{
"title" : "Adjust Conductor Resistance at",
"formType" : "textBox",
"disabled" : true,
"value" : 77,
"appendLabel" : true,
"appendLabelText" : "°F"
}
]
}
]
};
ko.mapping.fromJS(formData);
下面是相同代码的示例:http://jsfiddle.net/etiennenoel/wG9SZ/3/
使用映射和不使用映射之间的问题是什么?
第二种情况你忘了ApplyBindings
ko.applyBindings(formData);
我不知道你的情况是否如此,但这值得一贴。
我有映射插件的问题,当我有一个更复杂的视图模型嵌套属性或列表。结果是,在映射到已经构造的视图模型之后,子对象不再是可观察对象。有了这个问题,对我来说,这段代码工作了,我在某个地方发现了什么(不幸的是,我已经不知道在哪里)。在映射到视图模型之后,我调用了这个函数。
function makeAllObservables(observable) {
// Loop through its children
for (var child in observable()) {
// If this child is not an observable and is an object
if ((!ko.isObservable(observable()[child])) && (typeof observable()[child] === "object")) {
// Make it an observable
observable()[child] = ko.observable(observable()[child]);
// Make all of its children observables
makeAllObservables(observable()[child]);
}
}
};
用法(当从服务器响应更新模型时,第一行不应该在那里):
var model = ko.observable({});
ko.mapping.fromJS(myJSObject, {}, model);
makeAllObservables(model);
ko.applyBindings(model);
添加映射到已经构造的视图模型,例如,当您想用来自服务器的新JSON数据更新视图模型时。在这种情况下,如果没有上面的代码,我就丢失了嵌套绑定。
更新:我已经找到了我借用技术的来源,在这里。请注意,我在那篇文章中稍微修改了代码,因为不知何故,这对我来说不工作。
您需要将映射的视图模型绑定到视图:
ko.applyBindings(ko.mapping.fromJS(formData));
,因为现在所有东西都是一个可观察对象,所以视图中的逻辑需要更改为使用方法语法:
<!-- ko if: $data.formType() === "select" -->
要获得要显示的选项,您需要告诉knockout对象的属性名称:
<select data-bind="options: $data.value, optionsText: 'title'"></select>