Javascript 敲除映射并不表示html的期望值
我对敲除映射有问题。我使用knockout映射插件来表示用JSON序列化的表单。在使用敲除映射之前它是有效的,但是我需要使用敲除映射,因为我希望我的属性是可观察的 您可以在此处看到工作html: 这是我不工作的javascript代码:Javascript 敲除映射并不表示html的期望值,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我对敲除映射有问题。我使用knockout映射插件来表示用JSON序列化的表单。在使用敲除映射之前它是有效的,但是我需要使用敲除映射,因为我希望我的属性是可观察的 您可以在此处看到工作html: 这是我不工作的javascript代码: var formData = {"data": [ { "groupName" : "Properties", "content" :
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);
下面是相同代码的JSFIDLE:
使用映射和不使用映射之间有什么问题?在第二种情况下,您忘记了应用绑定
ko.applyBindings(formData);
在第二种情况下,您忘记应用绑定
ko.applyBindings(formData);
我不知道你的情况是否如此,但值得一贴 当我有一个更复杂的带有嵌套属性或列表的viewmodel时,我遇到了映射插件的问题。事实证明,在映射到已构建的viewmodel之后,子对象不再是可见的。有了这个问题,对我来说,这段代码起作用了,我在某处找到了什么(不幸的是,我真的不知道在哪里)。映射到viewmodel后,我为viewmodel调用了此函数
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]);
}
}
};
用法(从服务器响应更新模型时,第一行不应出现):
例如,当您希望使用服务器上的新JSON数据更新viewmodel时,将映射到已构建的viewmodel。在这种情况下,我丢失了没有上述代码的嵌套绑定
更新:我找到了我借用技术的来源。请注意,我在那篇文章中稍微修改了代码,因为不知怎么的,这对我不起作用。我不知道您的场景是否如此,但值得一提 当我有一个更复杂的带有嵌套属性或列表的viewmodel时,我遇到了映射插件的问题。事实证明,在映射到已构建的viewmodel之后,子对象不再是可见的。有了这个问题,对我来说,这段代码起作用了,我在某处找到了什么(不幸的是,我真的不知道在哪里)。映射到viewmodel后,我为viewmodel调用了此函数
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]);
}
}
};
用法(从服务器响应更新模型时,第一行不应出现):
例如,当您希望使用服务器上的新JSON数据更新viewmodel时,将映射到已构建的viewmodel。在这种情况下,我丢失了没有上述代码的嵌套绑定
更新:我找到了我借用技术的来源。请注意,我在那篇文章中稍微修改了该代码,因为不知何故,这对我来说不起作用。您需要将映射的viewmodel绑定到视图:
ko.applyBindings(ko.mapping.fromJS(formData))代码>
由于现在一切都是可观察的,因此需要更改视图中的逻辑以使用方法语法:
要获得要显示的选项,您需要告诉knockout对象上的属性名称:
您需要将映射的viewmodel绑定到视图:
ko.applyBindings(ko.mapping.fromJS(formData))代码>
由于现在一切都是可观察的,因此需要更改视图中的逻辑以使用方法语法:
要获得要显示的选项,您需要告诉knockout对象上的属性名称:
你到底怎么称呼它呢。我是说,你能观察到什么?在我的例子中,ko.mapping.fromJS(formData)会是什么?为什么会有这部分行:,$(“#myform”).get(0))@CoachNono,因为在我的例子中,我有多个表单,我只想对一个特定的表单应用这个绑定。.get(0)将从jQuery结果返回第一个匹配的表单。。。是的,因为您没有id为“myform”的表单。我认为不应该使用第二个参数。仅当您希望在特定HTML元素中应用绑定时才需要它。抱歉搞混了,我已经把它从我的帖子中删除了。你怎么称呼它呢。我是说,你能观察到什么?在我的例子中,ko.mapping.fromJS(formData)会是什么?为什么会有这部分行:,$(“#myform”).get(0))@CoachNono,因为在我的例子中,我有多个表单,我只想对一个特定的表单应用这个绑定。.get(0)将从jQuery结果返回第一个匹配的表单。。。是的,因为您没有id为“myform”的表单。我认为不应该使用第二个参数。仅当您希望在特定HTML元素中应用绑定时才需要它。很抱歉造成混淆,我已将其从我的帖子中删除。为什么我选择的项目未显示?我不确定,我正在查看您的绑定以尝试查看。我已经有一段时间没用击倒了。谢谢你,因为它以前工作过,太奇怪了!我丢失了:,由@DaveBy发现。为什么我选择的项目没有显示?我不确定,我正在查看您的绑定以尝试查看。我已经有一段时间没用击倒了。谢谢你,因为它以前工作过,太奇怪了!我丢失了:,由@DaveBthank找到,但是,我在尝试后没有看到我的选择中的项目。当我使用您的代码时,我的JSON不会得到更新,但当使用第一人称的答案时,它会得到更新。您的感谢,但是,我没有看到我的选择中的项目,在尝试之后当我使用您的代码时,我的JSON不会得到更新,但是当使用第一人称的答案时,它会得到更新。你的