gpt4 book ai didi

Knockout.js 将 JSON 对象映射到 Javascript 对象

转载 作者:行者123 更新时间:2023-12-02 16:23:07 26 4
gpt4 key购买 nike

我在将从服务器接收到的 Json 对象映射到预定义的 Javascript 对象时遇到问题,该对象包含绑定(bind)中使用的所有必要函数

Javascript代码如下

function Person(FirstName, LastName, Friends) {
var self = this;
self.FirstName = ko.observable(FirstName);
self.LastName = ko.observable(LastName);
self.FullName = ko.computed(function () {
return self.FirstName() + ' ' + self.LastName();
})
self.Friends = ko.observableArray(Friends);
self.AddFriend = function () {
self.Friends.push(new Person('new', 'friend'));
};
self.DeleteFriend = function (friend) {
self.Friends.remove(friend);
};
}

var viewModel = new Person();

$(document).ready(function () {
$.ajax({
url: 'Home/GetPerson',
dataType: 'json',
type: 'GET',
success: function (jsonResult) {
viewModel = ko.mapping.fromJS(jsonResult);
ko.applyBindings(viewModel);
}
});
});

HTML:

<p>First name: <input data-bind="value: FirstName" /></p>
<p>Last name: <input data-bind="value: LastName" /></p>
<p>Full name: <span data-bind="text: FullName" /></p>
<p>#Friends: <span data-bind="text: Friends().length" /></p>
@*Allow maximum of 5 friends*@
<p><button data-bind="click: AddFriend, text:'add new friend', enable:Friends().length < 5" /></p>
<br>
@*define how friends should be rendered*@
<table data-bind="foreach: Friends">
<tr>
<td>First name: <input data-bind="value: FirstName" /></td>
<td>Last name: <input data-bind="value: LastName" /></td>
<td>Full name: <span data-bind="text: FullName" /></td>
<td><button data-bind="click: function(){ $parent.DeleteFriend($data) }, text:'delete'"/></td>
</tr>
</table>

用于获取初始数据的服务器端 MVC 代码如下所示:

    public ActionResult GetPerson()
{
Person person = new Person{FirstName = "My", LastName="Name",
Friends = new List<Person>
{
new Person{FirstName = "Friend", LastName="Number1"},
new Person{FirstName = "Friend", LastName="Number2"}
}
};
return Json(person, JsonRequestBehavior.AllowGet);
}

我正在尝试使用映射插件将 Json 加载到我的 Javascript 对象中,以便所有内容都可用于绑定(bind)(add-function 和 Friend 对象上的计算属性)。

当我使用映射插件时,它似乎不起作用。使用插件时,AddFriend 方法在绑定(bind)期间不可用。是否可以使用映射插件填充 JavaScript Person 对象,还是必须手动完成所有操作?

最佳答案

您可以查看将映射选项传递给映射插件,特别是 create 回调,如所述 here .

类似于:

var mapping = {
create: function(options) {
var person = options.data,
friends = ko.utils.arrayMap(person.Friends, function(friend) {
return new Person(friend.FirstName, friend.LastName);
});

return new Person(person.FirstName, person.LastName, friends);
}
};

示例:http://jsfiddle.net/rniemeyer/5EWDG/

但是,在这种情况下,您无法从映射插件中获得太多功能,您可以直接调用 Person 构造函数,并将 Friends 数组映射到构造函数中的 Person 对象,例如: http://jsfiddle.net/rniemeyer/mewZD/

HTML 中的另一个注意事项:确保对于包含内容的元素,指定开始和结束标记(spanbutton 在你的代码)。如果指定不正确,KO 就会出现问题。

关于Knockout.js 将 JSON 对象映射到 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8805548/

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