我的Onlinefriends模型中有一个名为FriendsOnline的可观察数组已映射,我想在其中添加一个新项目。这是我最初的尝试。
onlineFriends.addFriend = ko.computed(function () {
socket.on('friend joined', function(data) {
var mapping = {
'friendsOnline': {
create: function(options) {
return new friendModel(data);
}
}
};
onlineFriends.friendsOnline.push(ko.mapping.fromJS(data));
console.log(onlineFriends.friendsOnline());
});
});
但我收到错误:Uncaught ReferenceError: Unable to process binding "text: function(){return firstName() }"
Message: firstName is not defined
我知道这是因为我在数组上使用foreach并调用
data-bind="text:firstName()
<li class="online" data-bind="click:$parent.startChat" >
<div class="media">
<a class="pull-left profile-photo" href="">
<img class="media-object" src="assets/images/ici-avatar.jpg" th:alt="alt"></img>
</a>
<div class="media-body">
<h6 class="media-heading"><span data-bind="text:firstName()">Ing. Imrich </span></h6>
<small><i class="fa fa-map-marker"></i> <span data-bind="text:country()">Ulaanbaatar, Mongolia</span></small>
<span class="badge badge-outline status"></span>
</div>
</div>
</li>
</ul>`
这就是我得到的json数据:
{"firstName":"Mfon","id":"2","address":"vgc","bio":"A man’s gotta make at least one bet a day, else he could be walking around lucky and never know it.","country":"Macau S.A.R.","email":"mfon@gmail.com","firstname":"Mfon","gender":"FEMALE","lastname":"Ukim","locked":false,"money":0,"onlinestatus":"ONLINE","password":"mfon","phonenumber":"08023182388","picture":"generic-avatar.jpg","username":"mfon","usertype":"PLAYER"}
根据我的理解,我感觉我从套接字收到的项目,它的字段没有正确映射到observables,但它们只是被推入数组。所以他们不能被召唤。请有人帮帮我吗?
答案 0 :(得分:0)
这一行 onlineFriends.friendsOnline.push(ko.mapping.fromJS(data)) - 应该可以正常工作,并为可观察数组添加新的observable。
很少有事要注意:
如果你想在执行fromJS操作时使用映射,你需要指定这是调用。在你的情况下,这将是:onlineFriends.friendsOnline.push(ko.mapping.fromJS(data,mapping));
并检查html中的父上下文,其中你使用firstName,常见的问题是它不是你想要的那个。
当你在HTML中使用绑定时,你可以指定不带()的observable,比如data-bind =“text:$ data.firstName”。在这种情况下,这一行对于observable和简单值都可以正常工作
顺便说一句,你在json中有2个类似道具“firstName”和“firstname”
这条线在你的情况下印刷什么? console.log(onlineFriends.friendsOnline()); 如果这打印出所有可观察数据的正确数据,那么你在html中定义了绑定上下文的问题