【问题标题】:Backbone.js multiple views, one collection, one fetchBackbone.js 多视图,一个集合,一个获取
【发布时间】:2017-07-20 22:24:46
【问题描述】:

我正在尝试使用一个集合生成多个视图,并且每 5 秒获取一个。

下面是一个工作示例,但两个视图在获取时都会刷新。 我可以将响应拼接成多个 url,但我想尽量减少请求的数量。

我当前的问题是,当重新获取集合时,我不希望所有视图每 5 秒重新渲染一次,只有关联的视图发生了变化。 我尝试在集合中创建多个模型并在解析函数中添加正确的对象,但没有任何运气。

回复:

{
  "json-1": {
    "sub_1": "3",
    "sub_2": [],
  },
  "json-2": {
    "sub_1": [],
    "sub_2": "1",
  },
}

// 客户端

const APICollection = Backbone.Collection.extend({
    initialize: (models, options) => {
        this.id = options.id;
    },
    url: () => {
        return 'https://url.url/' + this.id;
    },
    model: APIModel,
        parse: (resp) => {
        return resp;
    },
});

const ViewOne = Backbone.View.extend({
    initialize: function () {
        this.collection.bind('sync', this.render, this);
        this.update();
        _.bindAll(this, 'update');
    },
    render: function (n, collection) {
        // Render view
    },
    update: function () {
        let self = this;
        this.collection.fetch({
            update: true, remove: false, success: function () {
                setTimeout(self.update, 5000);
            }
        });
    }
});

// Also updates when re-fetched
const ViewTwo = Backbone.View.extend({
    initialize: function () {
        this.collection.bind('sync', this.render, this);
    },
    render: function (n, collection) {
        // Render function
    }
});

let col = APICollection([], {id: 'someid'});
new ViewOne({collection: col, el: $("#one")});
new ViewTwo({collection: col, el: $("#two")});

**更新

澄清:“只有关联的视图发生了变化”。我的意思是“ViewOne”应该只在“json-1”发生变化时重新渲染,而“ViewTwo”不应该重新渲染。目前完整的响应发送到两个视图。

【问题讨论】:

  • "...只有关联的视图发生了变化。" - 你必须澄清这一点,集合中的某些模型是否与某些视图相关?是什么让一种视图在处理集合的方式上与另一种不同?
  • 我会更新问题
  • 如果你的响应没有返回一个数组,你应该使用Backbone.Model而不是Backbone.Collection,然后你可以在每个视图中监听change:attr事件。
  • 那,谢谢:)。您可以将此添加为答案以便我接受吗?

标签: javascript backbone.js


【解决方案1】:

在处理返回对象而不是对象数组的 API 时,最好的方法是直接使用 Backbone.Model

update: function () {
    let self = this;
    this.model.fetch({
        update: true, remove: false, success: function () {
            setTimeout(self.update, 5000);
        }
    });
}

模型仍然以与集合相同的方式获取,但视图可以侦听模型上的特定属性,而不是:

this.collection.bind('sync', this.render, this);

可以使用以下内容:

this.model.bind('change:json-1', this.render, this);

提示:最好使用listenTo而不是绑定,这样更安全(见docs

this.listenTo(this.model, 'change:json-1', this.render);

【讨论】:

  • setTimeout(self.update, 5000); 将不起作用,因为第一次执行超时回调时上下文将丢失。相反,您应该使用fetch 函数的context 选项并将this.update.bind(this) 传递给setTimeout
  • 另外,使用这种技术,在第一个错误时,5 秒循环将停止。
  • @EmileBergeron - 不确定上下文是否会丢失,但肯定会有更好的错误处理。我要补充一点,如果是我的代码,我会在模型内部添加重新获取机制,而不是视图,就模型/视图抽象而言,它更简洁一些。
  • 它将丢失,因为您将函数引用传递给setTimeout,并且它将在没有任何上下文的情况下按原样调用(如callback())。
  • 不,我不会将重新获取添加到模型中,因为它特定于应用程序。如果您想在不重新获取的情况下重用模型怎么办?
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多