2015-10-27 3 views
0

У меня это довольно простое controller + router ниже, например, цели. Мой вопрос: как мне работать с маршрутизатором и Backbone.history, если я изменил определенную модель?Как работать с модифицированными моделями при использовании Backbone.history

Предположим, что я запустил route r и controller. По умолчанию маршрут "" приводит меня к функции blue, где я устанавливаю фон в синий цвет. Я могу нажать на кнопку, которая приведет меня к функции red, где она устанавливает красный фон и URL-адрес /#red.

Если я нажму кнопку «Назад», я вернусь к своему "" url, но фон останется красным. Есть ли способ получить предыдущее состояние и не только изменить URL-адрес при работе с историей?

Я понимаю, что в функции blue, я мог бы просто установить фон, чтобы быть синим, а не this.model.get("background), но я прошу в более сложных случаях, как получить предыдущее состояние this.model через Backbone.history.

MyApp.module('Main', function (Main, MyApp, Backbone, Marionette, $, _){ 

    Main.Router = Marionette.AppRouter.extend({ 
     appRoutes: { 
      "": "blue", 
      "red": "red" 
     } 
    }); 

    Main.Controller = Marionette.Controller.extend({ 
     start: function() { 
      console.log("MyApp Controller start..."); 

      this.model = new Backbone.Model({background: "blue"}); 

      Backbone.history.start() 
     }, 

     blue: function() { 
      $("body").css("background-color", this.model.get("background"));    

      $("#button").click(function() { 
       //MyApp.router.navigate("red", {trigger: true}); 
       MyApp.controller.red(); 
      }); 
     }, 

     red: function() { 
      this.model.set({background: "red"}); 
      $("body").css("background-color", this.model.get("background")); 
      MyApp.router.navigate("red"); 
     } 
    }); 
}); 
+1

Вы можете попробовать [previousAttributes] (http://backbonejs.org/#Model-previousAttributes), но это звучит так, как будто у вас есть недостаток дизайна для начала. Если вам нужны полностью обновленные атрибуты модели, вам может понадобиться создать для них свою собственную структуру данных, а модель сохранит текущее состояние, а не всю историю. – ivarni

+0

Скорее всего, я не полностью понимаю MVC. Как бы вы справились с этой ситуацией: 1. маршрутизатор вызывает метод контроллера, который показывает представление из модели 2. пользователь удаляет модель кликом, и он меняет URL-адрес. 3. пользователь хочет вернуться назад и увидеть модель, которую он просто удалил. –

+0

У меня есть ответ здесь - http://stackoverflow.com/a/33327942/132829 = - это может быть полезно для вас. Там очень похож набор с Marionette Router и Controller, который обрабатывает открытие любого маршрута напрямую, а кнопки назад/вперед тоже работают. – Yura

ответ

1

MyApp.router.navigate("red"); - Это только изменяет URL, но на самом деле не вызывает ваш метод контроллера для стрельбы. Возможно, у вас возникнет соблазн установить опцию {trigger:true}, но avoid that.

Просто вызовите метод контроллера для этого маршрута. У меня очень похожий пример рабочего примера в моем ответе: How can I show and hide regions in Marionette.js?

Правда, в вашем примере кода есть несколько вещей. Например, вы не должны устанавливать кнопки управления кликом в своем контроллере, это работа вида. Контроллеры должны просто выполнять самую абстрактную работу, например, очищать и визуализировать представление. Фактическое взаимодействие с пользователем должно обрабатываться в представлениях.

+0

Я знал о '{trigger: true}', и именно поэтому я не включил его в свой пример. Кроме того, я знаю о просмотрах, но кнопка была просто грязным решением, чтобы показать, что модель менялась. Хотя я благодарю вас за то, что связал мне этот ответ, мой вопрос был более связан с историей. Предполагая, что модель изменилась и вызвала событие, которое изменило представление, как я могу получить старое состояние модели, предполагая, что пользователь нажал «назад» и покажет старое представление перед запуском события. –