这是一个两部分的问题。我们有一个 Marionette.js 应用程序,其中,在初始加载时,我们需要“订阅”一个 Lightstreamer 实例并保持该实例/连接打开(Lightstreamer 是什么并不重要,只是它将更新发送到页面)。后续模型更新通常不会由来自 Lightstreamer 的更新由用户操作触发。我对如何构建它感到不知所措。
首先,默认模型 fetch() 操作似乎向模型的 url 属性发出 Web 请求,并根据用户操作同步检索数据(在大多数示例中)。对我们来说,获取本质上是“订阅”操作,初始数据(消息集合)将异步返回。我已经看到了使用 jquery deferred 的建议,但我不确定 done() 函数在哪里(在模型中?在模块中?)。
其次,我们似乎会以某种方式使用 wreqr 来注册推送更新,但我也不确定那会是什么样子。
这是一些伪代码:
MyApp.Lightstreamer = codeToGetTheLightstreamerWiredUp();
MyApp.MyCollection = Backbone.Collection.extend({
model: MyApp.Message,
initialize: function(models, options) {
this.id = options.id;
},
fetch: function () {
MyApp.Lightstreamer.Do('subscribeUpdate'), {
adapterName: 'AdapterName',
parameterValue: this.id,
otherStuff: 'otherstuff',
onUpdate: callbackFunction
}
});
MyApp.module("MyApp"...) {
MyApp.Router = Marionette.AppRouter.extend(
{
appRoutes: { 'controller/view/:id', 'subscribe' }
}
);
var Api = {
subscribe: function(id) {
var messages = new MyApp.MyMessages({ id: id });
var deferred = $.Deferred();
messages.fetch({
success: deferred.resolve
}
}
};
QaApp.addInitializer(function () {
var router = new QaApp.Router(
{
controller: Api
});
});
}
- 问题 1:callbackFunction 和/或 deferred 在这种情况下如何工作
- 问题 2:当发生具有新数据的推送事件(例如,要添加到集合中的新消息)时,如何更新此模型?
谢谢!