gpt4 book ai didi

Knockout.js:绑定(bind)到复杂对象

转载 作者:行者123 更新时间:2023-12-04 03:12:27 25 4
gpt4 key购买 nike

我是 knockout.js 的新手,我正在尝试绑定(bind)到以下代表用户的对象:

{
"$id": "1",
"$values": [
{
"$id": "2",
"Locations": {
"$id": "3",
"$values": []
},
"Photos": {
"$id": "4",
"$values": []
},
"UserId": 1,
"Name": "Test User"
}
]
}

用户可以零个或多个位置,以及零个或多个照片。

View 模型:
function UsersViewModel() {
var self = this;
self.users = ko.observableArray();

var baseUri = 'http://localhost:46241/api/users';

$.getJSON(baseUri, function (data) {
self.users = data;
});
}

$(document).ready(function () {
ko.applyBindings(new UsersViewModel());
})

HTML 包含以下绑定(bind):
<ul id="update-users" data-bind="foreach: users"> 
<li>
<div><div class="item">User ID</div>
<input type="text" data-bind="value: $data.UserId" />
</div>
<div><div class="item">Name</div>
<input type="text" data-bind="value: $data.Name" />
</div>
</li>
</ul>

我做错了吗?或者用户对 Locations 和 Photos 的对象引用可能会破坏绑定(bind)?

最佳答案

Am I flat out doing this incorrectly?



是的。您正在覆盖您的 observableArray在 JSON 回调中,从而破坏它:
$.getJSON(baseUri, function (data) {
self.users = data;
});

一般来说, knockout observables 是这样分配的:
$.getJSON(baseUri, function (data) {
self.users(data.$values);
});

请注意,在您的情况下, data.$values似乎包含实际数组,而不是 data本身。

这适用于您的情况,但它并没有充分发挥 knockout 的潜力。

mapping plugin正是为这种情况而创建的。它递归地遍历一个复杂对象并将其所有属性转换为可观察对象,并将所有包含的数组转换为可观察数组。这使您可以对对象的状态进行细粒度控制,从而使您可以监视每个更改。
$.getJSON(baseUri, function (data) {
ko.mapping.fromJS(data.$values, {}, self.users);
});

它还允许部分更新:假设您从服务器检索用户列表,并且您的 View 模型已经拥有其中的一半。映射插件能够仅将那些缺失的 View 添加到您的 View 模型中,并对现有的进行适当的更改。阅读 "Advanced usage" section如果你想知道如何在文档中。

假设您从服务器获取一组用户对象并使用映射插件,那么您的绑定(bind)将如下所示:

<ul id="update-users" data-bind="foreach: users"> 
<li>
<div><div class="item">User ID</div>
<input type="text" data-bind="value: UserId" />
</div>
<div><div class="item">Name</div>
<input type="text" data-bind="value: Name" />
</div>
<ul class="photos" data-bind="foreach: Photos.$values">
<!-- ... -->
<ul>
</li>
</ul>

一般来说,@Greg Smith 的评论是正确的。尝试失去 $在对象键中,它们可能会在某些时候与 knockout 中的特殊变量发生冲突。例如,您可以安全地用下划线替换它们。

在更一般的说明中,我会尝试删除整个 $id/ $values如果我是你,你的 JSON 中的概念,它似乎没有任何用途:
[
{
"Locations": [],
"Photos": [],
"UserId": 1,
"Name": "Test User"
}
]

关于Knockout.js:绑定(bind)到复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13439002/

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