Knockout.js knockout js将相同的数据两次推入我的可观察数组,为什么?

Knockout.js knockout js将相同的数据两次推入我的可观察数组,为什么?,knockout.js,Knockout.js,这是我的代码,它从套接字调用收集数据,将其转换为可观察的,并将其推送到可观察的数组中 model.friendHasJoined = ko.computed(function () { socket.on('friend joined', function(data) { var mapping = { 'friendsOnline': { create: function(options) {

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

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())

    });

});

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

一个传递给
ko的函数。computed
会立即执行,并且每当它的一个依赖项发生变化时。如果函数有副作用,例如在回调上附加
套接字。这可能是一个问题。如果出于某种原因,它碰巧运行了两次,那么您将得到两个附加的回调,从而导致重复数据进入您的可观察数组

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())

    });

});

我不能确切地知道这是否是实际发生的情况,但我的建议是删除
ko.computed
包装器,看看问题是否仍然存在。

你是说我可以在模型类中直接使用套接字吗?我希望类似于
model.socketConnection=socket.on(“friend joined”,model.addFriend)
其中的
模型。addFriend
是您已经编写的函数。哇,我不知道这是可能的atol,非常感谢,我今天将尝试它