我正在构建我的第一个非常简单的Backbone JS应用程序,但我正在努力解决一个基本问题。虽然我已经对MVC上的Backbone JS视图有了基本的了解,但我想知道:我应该如何引导我的应用程序?
我已经准备好了所有模型,视图和集合,但是如何将它们整合在一起?
当然,我必须实例化我的路由器:
new App.Router();
Backbone.history.start();
之后,我实例化我的主视图:
new App.Views.Main();
我已经读过这样做是很好的做法,其中应该加载视图,应该处理事件等等。但是我该怎么做呢?
这是否与所谓的最佳实践冲突,将东西绑定到路由器触发的事件?我也读过这是处理事情的正确方法:
App.vent = _.extend({}, Backbone.Events);
App.Router = Backbone.Router.extend({
routes: {
'' : 'index'
},
index: function() {
// Here, params passed to be main view can be passed along to other views
App.vent.trigger('app:init');
}
});
那么我该如何正确启动我的应用程序呢?
答案 0 :(得分:0)
简单的答案是:使您的主视图依赖于路由器,并让视图侦听来自路由器的事件。有点像:
var MyMain = Backbone.View.extend({
initialize: function(options) {
this.router = options.router;
this.listenTo(this.router, 'some route event', this.myroutehandler);
}
myroutehandler: function(...) {
// handle the routing
}
});
var app = new MyMain({router: new MyRouter()});
当然,您可以通过创建依赖于视图的路由器来反转此依赖关系。
只要您清楚地了解对象的独特责任,使对象相互依赖并没有太大的错误。主视图可能负责处理路径事件。您可能会很好地介绍另一个负责将各个部分捆绑在一起的对象。这通常被称为"前控制器"。
然而,通常更有意义的是拥有一个能够保持"状态"您的应用程序,并让单独的视图侦听该模型上的更改事件,以便他们可以采取相应的行动。这通常是更好的方法,因为它不再重要的是谁或什么改变了状态,并且你有额外的好处,让模型验证状态转换,即,如果某些事情应该禁止状态改变,则不在某处导航。
然后,该模型会监听路由中的更改(无论何时用户按下后退按钮或在某处导航),并且只要其状态从外部更新,就会更改历史记录状态而不触发事件。这样,您的视图不再需要了解路由器和/或历史记录对象,这使得它更加透明,负责更改历史状态并在整个应用程序中委派此状态的更改。