通常我有一个View,我将侦听器设置为模型更改,就像这样(混合):
var jsonModel = {bla: 'interesting stuff'}; //some model in json, probably rendered in a dom-element and passed from the server to the client
var someModelType = Backbone.RelationalModel.extend({
bla: "String"
});
var someModelInstance = new someModelType(jsonModel);
var someViewType = Backbone.View.extend({
initialize: function(){
this.listenTo(this.model,'change:bla', function(model){
//update view to sync with model change here
}
}
});
var someViewInstance = new someViewType({
model: someModelInstance
});
我正在寻找首选/主干 - 引导视图的方式,即:我希望我的视图(表单字段或你有什么)在创建时与模型同步。由于模型是在附加视图之前创建的,因此上述情况是不可能的,这导致在初始化视图的侦听器之前触发模型更新/更改。
当然我可以编写一些自定义bootstapping逻辑来手动调用监听器函数,但由于这一定是一个常见的问题,我正在寻找一些最佳实践建议,甚至更好,一个Backbone-switch I需要设置让它工作。
答案 0 :(得分:0)
这听起来很傻,但我通常做的是在创建视图后做一个render()。
对我而言,变更事件的重点是通知变更。事实上,它也是在创造时触发的(作为“与默认相比发生了变化”)更多的是副作用而不是任何深层次......
从这个意义上说,当我创建视图并给它一个现有的模型时,我希望模型有点准备好,所以我应该能够立即做一个render()。所以我的引导代码更像是:
var someViewInstance = new someViewType({
model: someModelInstance
});
someViewInstance.render()
或者在绑定后的initialize()中进行,如果你觉得冒险(我个人不喜欢这样做,因为在处理子视图时,很难确切知道什么时候你想要渲染,特别是当依赖于图书馆时需要DOM准备好,并且无法在分离的节点上工作。)
总而言之,虽然你的问题很常见,但对我来说,它并不需要任何复杂的解决方案:你有一个render()函数将你的模型转换成DOM的东西,你的模型可能会也可能不会准备就绪,但它存在,所以你将它传递给视图,并在手动创建视图后进行第一次渲染,因为你知道它需要发生。然后,在更新模型的情况下绑定到更改,以相应地更新DOM。
旁注:如果是模型集合,当模型没有准备就绪时,那么它可能甚至不应该有一个实例,你应该让集合为你提供一些添加/删除事件它突然存在。