我应该如何让Backbone应用程序中的视图相互更改?

时间:2011-12-01 17:41:27

标签: javascript backbone.js

我有一个名为Foo的Backbone视图,它有一个滚动条。当滚动条向某个方向移动时,我希望我的应用程序中的其他视图以各种方式更改。这些视图不嵌套在Foo中 - 它们是完全独立的并且是独立管理的。

我是否应该将对所有其他视图的引用传递给Foo的构造函数,以便它可以手动更新它们?或者我应该使用事件来通知滚动条移动的其他视图?如果是这样,Foo会触发什么对象,并由其他视图监听?

这些是纯粹的视觉变化,并没有支持它们的模型。

1 个答案:

答案 0 :(得分:3)

我会在这种情况下使用事件

举个例子:

NavigationView = Backbone.View.extend({
  initialize: function(options){
    options.events.bind("navigation:change", this.changeNavigation);
    this.render();
  },

  changeNavigation: function(key){
    $('.menuItem', $(this.el)).removeClass("active");
    $('.menuItem', $(this.el)).filter("." + key).addClass("active");
  },

   render: function(){
     // rendering goes on here....

   }
});

UserListView = Backbone.View.extend({

  initialize: function(options){
    options.events.trigger("navigation:change", "users");
    this.render();
  },

  render: function() {
    // rendering goes on here....

  }
});

// kickstart the application

var myEvents = _.extend({}, Backbone.Events);

var myNavigation  = new NavigationView({events: myEvents});

// this is just a collection of users... i left it out as it is not really the point here...
var users = new UserList(); 

var myUserList = new UserListView({collection: users, events: myEvents});

如果您需要更多信息,在引用1个视图到另一个视图或事件时,您还可以好好看看Derick Bailey撰写的这篇文章,他将上述方法解释为eventAggregator并列出了如何记录的文档示例使用它(和替代品)。 http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/