如何使用List<ComplexObject>
将商品添加到KnockoutJS
?
这是我的模特:
public class MyModel
{
public List<User> Users { get; set; }
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
这是客户端脚本:
<script type="text/javascript">
var viewModel = ko.mapping.fromJS(@Html.Raw(Json.Encode(Model)));
ko.applyBindings(viewModel);
// attempt:
var newUser = [{ "Id": "13", "Name": "John" }];
</script>
如何将newUser
添加到viewModel
?
答案 0 :(得分:2)
我会按以下方式进行。
请参阅下面的完整代码并附上评论
// 1. Create a User object
var User = function (Id, Name) {
self = this;
self.Id = Id;
self.Name = Name;
}
// 2. Create a mapping
var mapping = {
'Users': {
create: function(options) {
return new User(options.data.Id, options.data.Name);
}
}
}
var data = @Html.Raw(Json.Encode(Model));
var viewModel = ko.mapping.fromJS(data, mapping);
// output to verify binding
console.log(viewModel);
// 3. Add the new User object
viewModel.Users.push(new User(2, "Jim"));
// output to verify added user
console.log(viewModel.Users());
<强>更新强>
这是一个jsfiddle与它对列表:
更新2
null问题似乎是你没有初始化集合,为你的模型添加一个构造函数,如下所示:
public MyModel()
{
Users = new List<User>();
}
答案 1 :(得分:0)
看到这个小提琴......
这有点像你有的。应用绑定之前,应定义视图模型元素以及rawData。
var rawData = { "OtherStuff": { }, "User": {"id": "1", "name": "Bob"} }
....
viewModel = new ViewModel(rawData);
ko.applyBindings(viewModel, document.getElementById('domElementToBind'));
然后我展示了创建对象的两个不同示例。查看小提琴并跟进任何进一步的问题。
- - - - - - - - EDITED 这是更新,因此您可以添加更多用户。关键是要让用户 - &gt;用户作为可观察数组并开始向其推送新用户。
self.newUser = new User();
self.addUser = function() {
self.Users.push(self.newUser);
}
- - - - - - - - EDITED 哎呀。这就是我不同时寻找的方式。
self.addUser = function() {
self.Users.push(new User(self.newUser.id(), self.newUser.name()));