3

现在我有很多绑定到主干模型的 UI 元素。该模型包含客户信息,并且每次搜索新客户时都会更改该模型,然后将其聚焦。以前的客户模型被这个新的模型覆盖。其中大多数(如果不是所有字段)名称相同,某些数组可能具有或多或少的元素,但总体上几乎相同。

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

4

1 回答 1

7

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

someView.model = someOtherModel;

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

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

但那是......好吧,这不是最好的类比,但这有点像擦除蒂姆林塞姆棒球卡并在上面画马特威廉姆斯,而不是简单地将蒂姆卡换成马特卡。无论哪种方式,你都会得到一张写着马特的棒球卡,但从概念上讲,这是一个不同的世界。

但是,如果您有很多共享相同模型的视图类,并且您希望一次为所有视图更改该模型是一种方便的操作,那么您可以采取一些方法。

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

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

...

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

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

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

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

(然后当然你需要做一些事情来制作getCurrentModelreturn 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

于 2013-03-16T00:39:23.030 回答