1

我正在将 Dojo 1.9 用于我正在使用 WebSockets 编写的 Web 应用程序。当客户端收到来自服务器的消息时,我需要使用收到的数据更新某些小部件。

// sock is the client-side of the websocket
sock.onmessage = function (dataIn) {
    // clientManager defined elsewhere
    clientManager.fireMessageReceived(dataIn);
};

这是我的问题:在我收到数据时,我没有 ID、DOM 节点或小部件来访问要更新的属性/值。clientManager专门处理 sock 事件,并且没有任何关于其数据将更新的小部件的具体知识。此外,可能有同一个小部件的多个实例,所以我认为尝试维护现有小部件(或 ID)的集合作为客户端管理器的属性可能会很快变得棘手。

所以,我的解决方案是使用 CSS 类。

我创建了一个空类并将其分配给我的小部件:

.myXYZWidget {

}

这样在我的fireMessageReceived函数中,我可以使用dojo/query它来找到它:

var myXYZWidgets = dojo.query(".myXYZWidget");
var i;

for (i = 0; i < myXYZWidgets.length; i++) {
    var xyzWidget = registry.byNode(myXYZWidgets[0]);

    ... // Now I have my Dojo widget, I can upate to my heart's content
}

这行得通,我没有看到这样做有任何重大缺点,但这可以吗?还是这很糟糕?社区中了解 Dojo 的任何人都可以确认此解决方案或提出更好的解决方案吗?

4

1 回答 1

2

类不一定是 CSS。因此,您没有使用 CSS 来获取 Dojo 小部件,您只是通过选择器/查询访问小部件。

如果我考虑您的问题,我会考虑发布者/订阅者模式,其中您的 websocket 是您的发布者(因为它接收数据并需要将其发送到您的小部件)并且您的小部件是您的订阅者。

订阅者(小部件)

幸运的是,dojo 有一些功能,它被称为dojo/topic模块。当你创建你的小部件时,你想确保它是你的 websocket 接收到的数据的订阅者。为此,我会做这样的事情(我dijit/form/Select在我的示例中使用 a ,但您可以将其重写为您想要的任何内容):

lang.mixin(mySelect, {
    __getData: function(data) {
         this.addOption(data);   
    }
});
mySelect.own(topic.subscribe("my/event", lang.hitch(mySelect, '__getData')));

这里发生的事情很容易(尽管看起来很难)。我要做的第一件事是确保我的小部件有一个名为__getData. 该方法将从 websocket 接收数据,并根据数据更新自己的数据。

然后我确保小部件订阅了名为my/event的事件(稍后您将看到这意味着什么)。


发布者(websocket)

然后在您的 websocket 代码级别,您希望发布到一个名为my/event的主题,以便您的小部件了解它。

你可以这样做:

topic.publish("my/event", myData);

myData您从 websocket 收到的数据在哪里。


所以现在流程完成了。您的 websocket 代码将向想要收听的人发送数据。侦听器(小部件)将使用数据并对其进行处理,例如向自己添加项目。

我还制作了一个展示完整示例的JSFiddle 。这个解决方案可能看起来更复杂,但我认为它在实用上更正确。

于 2013-07-05T20:05:18.157 回答