Обработка состояния магистрали с помощью вложенных моделей? - PullRequest
0 голосов
/ 25 октября 2011

Я бы хотел управлять всеми атрибутами состояния хэша (#) в одной модели 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. Как изменить триггер HistoryController при изменении вложенных моделей (в StateController)?

  2. И если хеш-код изменяется - и я бы хотел обновить мою StateModel - как эти изменения распространяются на вложенные модели? (без создания обратной связи)

1 Ответ

1 голос
/ 25 октября 2011

Вложенные модели в Backbone могут быть сложными, потому что методы получения и установки не имеют встроенных функций для работы на глубине. Однако я обнаружил, что лучший способ справиться с этим - хранить модели Backbone внутри других моделей Backbone. В вашем примере вы должны создать экземпляр StateModel, а затем установить его modelType1 и 2, скажем, экземплярами TypeModel. Затем вы можете stateModel.get("modelType1").bind("change",this.updateHistory) и stateModel.get("modelType2").bind("change",this.updateHistory). В качестве альтернативы, если вы собираетесь создавать множество TypeModels, вы можете поместить эту привязку в функцию инициализатора.

Во-вторых, вы можете stateModel.get("modelType1").bind("change",stateModelInstance.updateFoo) или любой другой метод, который вы хотите вызвать при изменении модели modelType.

Хорошая вещь в этом шаблоне состоит в том, что если вам требуется stateModel для изменения одной из моделей modelType, вы можете сделать stateModel.set({modelType1:newModel3}) или что-то в этом роде. Если вы установили действие привязки в инициализаторе TypeModel, все будет синхронизировано. Если вы не хотите выбрасывать вложенную модель при изменении, просто выполните stateModel.get ("nestedModel1"). Set ({"foo"}: "bar"). Это не должно вызывать петли обратной связи, если вы не связали что-то с действием изменения состояния stateModel, которое снова изменяет вложенную модель, но я не знаю, почему вы это сделали.

...