当前位置 : 主页 > 网页制作 > JQuery >

jquery – Backbone:合并模型但保留数据绑定

来源:互联网 收集:自由互联 发布时间:2021-06-15
现在我有很多绑定到主干模型的UI元素.此模型包含客户信息,每次搜索新客户时都会更改模型,然后将其引入焦点.以前的客户模型被这个新模型覆盖.如果不是所有字段中的大多数字段都是
现在我有很多绑定到主干模型的UI元素.此模型包含客户信息,每次搜索新客户时都会更改模型,然后将其引入焦点.以前的客户模型被这个新模型覆盖.如果不是所有字段中的大多数字段都是相同的名称,则某些数组可能具有更多或更少的元素,但总体上几乎相同.

有没有办法可以用新的模型信息覆盖旧的模型信息,但保留我的UI元素的所有绑定?

一般来说,如果你有someView,someView是用{model:someModel}声明的,并且你想让someView使用someOtherModel,那么正确的做法是:

someView.model = someOtherModel;

正如gumballhead建议的那样,您可以简单地使用以下方法更改模型的数据:

someView.model.set(someOtherModel.toJSON());

但那……这不是最好的比喻,但这有点像擦掉Tim Lincecum棒球卡并在上面画Matt Williams,而不是简单地换一张Tim牌作为Matt牌.无论哪种方式,你都会拿到一张名为马特的棒球卡,但从概念上讲,这是一个与众不同的世界.

但是,如果您有大量共享相同模型的视图类,并且您希望一次性地为所有视图更改该模型,那么您可以采用几种方法.

一种方法是跟踪某个列表中的所有视图,然后每当您想要更改模型迭代所有视图时,如下所示:

var viewsThatUseBaseballCard = [view1, view2, view3, view4];

...

_(viewsThatUseBaseballCard).each(function(view) {
    view.model = someOtherModel;
});

另一种方法是避免使用内置的this.model,而是在View代码中使用一个函数来随时获取模型;换句话说,而不是:

var MyView = Backbone.View.extend({
    someMethod: function() {
        this.model.doSomething();
    }
});

var MyView = Backbone.View.extend({
    someMethod: function() {
        getCurrentModel().doSomething();
    }
});

(当然,你需要做一些事情来让getCurrentModel返回someOtherModel,但至少它会被集中到代码中的一个地方).

以上还有其他变体,但一般的想法是你可以:

A)在您的视图中使用this.model,并根据需要设置一个新的this.model

B)在视图中使用某种getModel()调用,并修改告诉该函数以适当地返回新模型

(或者你可以C)保持相同的模型并改变它是什么,即.擦除/重写棒球卡选项).

我个人可能会倾向于B),但最终取决于你的情况.

*编辑*

刚刚意识到我错过了其他几个选项:

D)重新设计你的观点,使他们不依赖于同一个模型(不确定这是一个选项,但值得一提)

E)使用“参考模型”;换句话说,而不是:

new SomeView({model: TimLincecum});

做:

new SomeView({model: currentPlayerReference});

然后,在您的视图中,执行:

this.model.getCurrentPlayer();

这类似于我的选项B),但它具有额外的好处,可以让您存储在currentPlayerReference模型中不会更改的数据.

网友评论