Knockout js:我如何推送到已映射的可观察数组

时间:2018-06-05 12:01:15

标签: knockout.js

我的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并调用

HTML页面中的

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,但它们只是被推入数组。所以他们不能被召唤。请有人帮帮我吗?

1 个答案:

答案 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中定义了绑定上下文的问题