使用嵌套模型处理骨干状态?

时间:2011-10-25 11:54:12

标签: javascript model-view-controller backbone.js fragment-identifier

我想在一个Backbone模型中管理所有哈希状态属性(#)。

StateModel //Pseudo
  attributes
    layout : string
    modelType1 : model
    modelType2 : model

这样我就可以通过序列化这个单一模型来不断更新历史条目。

HistoryController

  StateModel.bind("change", this.updateHistory);
  [...]
  state = StateModel.toJSON()
  [...]
  appRouter.navigate('v1' + state, false);
  1. 当嵌套模型(在StateController中)发生变化时,如何更改HistoryController触发器?

  2. 如果哈希值发生变化 - 我想更新我的StateModel - 这些变化如何传播到嵌套模型? (不引起反馈循环)

1 个答案:

答案 0 :(得分:1)

Backbone中的嵌套模型可能很棘手,因为getter和setter方法没有内置功能来深度操作。但是,我发现处理此问题的最佳方法是将Backbone模型存储在其他Backbone模型中。在您的示例中,您将实例化StateModel,然后将其modelType1和2设置为TypeModel实例。然后,您可以stateModel.get("modelType1").bind("change",this.updateHistory)stateModel.get("modelType2").bind("change",this.updateHistory)。或者,如果您要创建大量的TypeModel,可以将此绑定放在初始化函数中。

其次,当modelType模型更改时,您可以stateModel.get("modelType1").bind("change",stateModelInstance.updateFoo)或您想要调用的任何方法。

这个模式的好处是,如果你需要stateModel来改变一个modelType模型,你可以做stateModel.set({modelType1:newModel3})或类似的东西。如果您已在TypeModel的ininitializer中设置了绑定操作,则所有内容都将保持同步状态。如果您不想在更改时吹掉嵌套模型,只需执行stateModel.get(“nestedModel1”)。set({“foo”}:“bar”)。这不应该导致反馈循环,除非你已经绑定了一些更改嵌套模型的stateModel更改操作,但我不知道为什么你会这样做。