gpt4 book ai didi

javascript - 使用 knockout 映射 JSON 无法填充类型定义的对象属性

转载 作者:行者123 更新时间:2023-11-30 17:58:32 25 4
gpt4 key购买 nike

我正在尝试使用 knockout.mapping 插件映射 JSON 数据,但是 heirarcical JSON 数据无法正确填充我的对象属性,顶级加载正常但不是子“RootTarget”数据?

我做错了什么?

knockout Javascript

var Query = function(json)
{
this.ID = ko.observable(0);
this.Name = ko.observable();
this.RootTargetID = ko.observable();
this.RootTarget = ko.observable();

var mapping = {
'RootTarget': {
create: function (args) {
return new QueryTarget(args.data, null);
}
}
};

ko.mapping.fromJS(json, mapping, this);
}


var QueryTarget = function(json, parent)
{
this.ID = ko.observable(0);
this.Name = ko.observable();
this.ParentID = ko.observable(0);
this.Parent = ko.observable(parent);
this.FilterID = ko.observable(0);

var mapping = {
'ignore': ["Parent"]
};

ko.mapping.fromJS(json, mapping, this);
}

var QueryModuleViewModel = function()
{
var json = {
"ID": 2,
"Name": "Northwind 2",
"RootTargetID": 2,
"RootTarget": {
"ID": 2,
"Name": "Customers",
"ParentID": null,
"FilterID": 2,
"Parent": null
}
};

this.QueryObj = new Query(json);
}

window.onload = function () {
ko.applyBindings(new QueryModuleViewModel());
};

HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>TypeScript Knockout Mapping Query Test</title>
<link rel="stylesheet" href="app.css" type="text/css" />

<script src="Scripts/jquery-2.0.2.js" type="text/javascript"></script>
<script src="Scripts/knockout-2.2.1.debug.js" type="text/javascript"></script>
<script src="Scripts/knockout.mapping-latest.debug.js" type="text/javascript"></script>
<script src="my_js_query_test.js"></script>

</head>
<body>
<h1>TypeScript Knockout Mapping Query Test</h1>
<div data-bind="with: QueryObj">
<span data-bind="blah: console.log($context)"></span>

<p>Query Name: <input data-bind="value: Name" /></p>

<hr />
<p>Quick test of RootTarget Values</p>
<p>RootTarget.ID: <input data-bind="value: RootTarget.ID" /></p>
<p>RootTarget.Name: <input data-bind="value: RootTarget.Name" /></p>
</div>
</body>
</html>

最佳答案

因为你的 RootTarget 被声明为一个 ko.observable 这是一个函数所以你需要用空参​​数调用它 () 到获取其值并访问存储的对象。

因此您只需要更改绑定(bind)并添加缺少的 ():

<p>RootTarget.ID: <input data-bind="value: RootTarget().ID" /></p>
<p>RootTarget.Name: <input data-bind="value: RootTarget().Name" /></p>

演示 JSFiddle.

或者你可以在这里使用with绑定(bind)

<p>Quick test of RootTarget Values</p>
<!-- ko with: RootTarget -->
<p>RootTarget.ID: <input data-bind="value: ID" /></p>
<p>RootTarget.Name: <input data-bind="value: Name" /></p>
<!-- /ko -->

演示 JSFiddle.

它有一些很好的优点:

  • 你不必重复 RootTarget
  • with 自动解包 observable,因此您只需编写 with: RootTarget,无需括号
  • 它适用于 RootTarget 值为 nullundified 的情况,因此它在原始解决方案 RootTarget 时隐藏输入().ID 会抛出空引用异常。

关于javascript - 使用 knockout 映射 JSON 无法填充类型定义的对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com