在Backbone.Views之间传递信息

时间:2013-05-27 02:54:45

标签: backbone.js

前言:我是一个Backbone noob。你在下面看到的大部分内容都可能是可怕的代码。

所以这就是我所拥有的: 我正在构建移动Workout应用跟踪器。我使用Junior框架来处理一些视图切换 - 这可能是我的问题,但令人怀疑。

此应用有两种型号:app.Workoutapp.Exercise。两者都不依赖于任何数据库后端,我现在只使用localStorage。这些模型还有2个集合,ala:

var app = app || {};

(function() {
  'use strict';

  /* collection */
  app.ExercisesCollection = Backbone.Collection.extend({
    model: app.Exercise,
    localStorage: new Backbone.LocalStorage("Exercises")
  });

  /* create the collection */
  app.Exercises = new app.ExercisesCollection();

})();

很好,所以现在我们有了这个系列。

如你所知,有锻炼。这些锻炼在其中有相关的练习。我选择将2个模型和集合分开,因为我认为它可能会变得过于复杂。也许我错了?

我的视图结构也很基础。流程将类似于:

Home -> 
  Workouts -> 
    (you can add workouts here, or delete)
    Exercises -> 
     (you can add exercises here, or delete)
     Add Exercise

我挣扎的是如何在这些视图之间传递数据。例如,我添加了一个Workout(工作正常,我只是添加到集合中)。现在我选择了Workout,并希望为它添加练习。好的,我加载了AddExerciseView,但是该视图如何知道我想要将锻炼添加到哪个锻炼?

我试过"传递"选项中的一些内容,但似乎并没有起作用。

onClickButtonAdd: function() {
  Jr.Navigator.navigate('add-exercise', {
    workoutName: this.workoutName,
    trigger: true,
    animation: {
      type: Jr.Navigator.animations.SLIDE_STACK,
      direction: Jr.Navigator.directions.UP
    }
  });
}

我试图通过workoutName,但这不起作用。

我是否考虑过这个问题,或者是否有更好的方法来管理观点/模型(我听说过Marrionette)。

谢谢!

1 个答案:

答案 0 :(得分:2)

有两种常用方法可以清晰地连接视图。

将模型作为选项传递给视图

在这种情况下,您可以执行类似new AddExerciseView({workout: selectedWorkoutModel})的操作,该视图将从用户收集数据,创建新的Exercise模型实例,并将其添加到其初始化选项中获得的锻炼模型中

视图发出事件,路由器/控制器从那里获取

在此版本中,您的AddExerciseView只会收集数据,创建新的exercise模型实例,然后发出类似create-exercise的事件。然后视图的工作就完成了,从那时起它就不知道也不关心练习模型实例会发生什么。在你的"胶水"可以存在于路由器或专用控制器对象中的代码,将事件侦听器绑定到AddExerciseView实例,并在create-exercise事件触发时,将新的运动模型实例添加到相应的锻炼实例中。

通常,第一个选项很好,特别是对于较小的应用程序,第二个版本开始变得更好,因为您的应用程序变得更大,并且视图开始在几个不同的上下文中重用。