gpt4 book ai didi

json - 使用 Knockout Mapping 显示嵌套的 JSON 数据

转载 作者:行者123 更新时间:2023-12-04 19:48:02 29 4
gpt4 key购买 nike

我正在尝试对内部包含可变数据的嵌套 JSON 对象使用 Knockout 的映射插件。但是,我不确定如何让它显示在我的 HTML 中。如何正确映射所有嵌套的 JSON 对象并将其显示为简单字符串?这是我的代码:

JS

var ListModel = function(jsonData) {
var self = this;
self.master = ko.mapping.fromJS(jsonData);
}
var listModel = new ListModel(jsonData);
ko.applyBindings(listModel);

HTML

<!-- ko foreach: master -->
<div data-bind="text: $data"></div>
<!-- /ko -->

示例 JSON

{"Level 1a":"Hi","Level 1b":{
"Level 2a":"Hello","Level 2b":{
"Level 3":"Bye"}
}
}

示例输出

Hi
Hello
Bye

我在这里要做的主要事情是打印出所有嵌套级别的值。键值和嵌套级别的数量是完全可变的(我在 SO 和网上找到的大多数嵌套 JSON 示例都是针对固定键的)。这可能吗?

更新:我找到了 jQuery equivalent ,但我仍然需要 observables 的 Knockout 实现。

最佳答案

由于您的 JSON 对象具有可变键,您必须先将其转换为固定的、可预测的结构,否则嵌套模板映射将不起作用(knockout 是声明性的,因此您需要事先知道键名)。

考虑以下自定义映射代码(不需要 knockout 映射插件):

var ListModel = function(jsonData) {
var self = this;

self.master = ko.observableArray([]);

function nestedMapping(data, level) {
var key, value, type;

for (key in data) {
if (data.hasOwnProperty(key)) {
if (data[key] instanceof Object) {
type = "array";
value = ko.observableArray([]);
nestedMapping(data[key], value());
} else {
type = "simple";
value = ko.observable(data[key]);
}
level.push({key: key, type: type, value: value});
}
}
}

nestedMapping(jsonData, self.master());
}

nestedMapping() 函数转换您的数据结构:

{
"Level 1a": "Hi",
"Level 1b": {
"Level 2a": "Hello",
"Level 2b": {
"Level 3": "Bye"
}
}
}

进入:

[
{
"key": "Level 1a",
"type": "simple",
"value": "Hi"
},
{
"key": "Level 1b",
"type": "array",
"value": [
{
"key": "Level 2a",
"type": "simple",
"value": "Hello"
},
{
"key": "Level 2b",
"type": "array",
"value": [
{
"key": "Level 3",
"type": "simple",
"value": "Bye"
}
]
}
]
}
]

现在您可以创建这样的模板:

<script type="text/html" id="nestedTemplate">
<!-- ko if: type == 'simple' -->
<div class="name" data-bind="text: value, attr: {title: key}"></div>
<!-- /ko -->
<!-- ko if: type == 'array' -->
<div class="container" data-bind="
template: {
name: 'nestedTemplate',
foreach: value
}
"></div>
<!-- /ko -->
</script>

查看它的工作情况:http://jsfiddle.net/nwdhJ/2/

请注意有关 nestedMapping() 的微妙但重要的一点。它创建嵌套的 observables/observableArrays。但它适用于 native 数组实例(通过将 self.master()value() 传递到递归中)。

这样您就可以避免对象构建过程中不必要的延迟。每次您将值推送到 observableArray 时,它都会触发 knockout 更改跟踪,但我们不需要那样。使用 native 数组会快得多。

关于json - 使用 Knockout Mapping 显示嵌套的 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152537/

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