首页 > 解决方案 > 淘汰赛 js 将相同的数据两次推送到我的可观察数组中,为什么?

问题描述

这是我的代码,它从套接字调用收集数据,将其转换为 observable 并将其推送到 observable 数组中。

model.friendHasJoined = ko.computed(function () {

    socket.on('friend joined', function(data) {


        var mapping = {
            'friendsOnline': {
                create: function(options) {
                    return new friendModel(options.data);
                }
            }
        };

        model.friendsOnline.push(ko.mapping.fromJS(data, mapping));

       // console.log(ray);

        console.log(model.friendsOnline())

    });

});

我注意到当我将可观察数据推送到数组中时,我得到的原始数据也被推送到数组中,使其成为数组中的两项,我只想要可观察的一项,这是为什么呢?

标签: knockout.js

解决方案


传递给 a 的函数ko.computed会立即执行,并且只要其依赖项之一发生更改。如果函数有副作用,例如socket.on回调的附件,这可能是个问题。如果由于某种原因它碰巧运行了两次,你最终会得到两个附加的回调,导致重复的数据进入你的 observable 数组。

我无法完全确定这是否是实际发生的情况,但我的建议是移除ko.computed包装器并查看问题是否仍然存在。


推荐阅读