Backbone JS:我如何引导我的应用程序?

时间:2015-05-30 11:21:26

标签: javascript backbone.js

我正在构建我的第一个非常简单的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');
  }
});

那么我该如何正确启动我的应用程序呢?

1 个答案:

答案 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()});

当然,您可以通过创建依赖于视图的路由器来反转此依赖关系。

只要您清楚地了解对象的独特责任,使对象相互依赖并没有太大的错误。主视图可能负责处理路径事件。您可能会很好地介绍另一个负责将各个部分捆绑在一起的对象。这通常被称为"前控制器"。

稍微好一点的方法

然而,通常更有意义的是拥有一个能够保持"状态"您的应用程序,并让单独的视图侦听该模型上的更改事件,以便他们可以采取相应的行动。这通常是更好的方法,因为它不再重要的是谁或什么改变了状态,并且你有额外的好处,让模型验证状态转换,即,如果某些事情应该禁止状态改变,则不在某处导航。

然后,该模型会监听路由中的更改(无论何时用户按下后退按钮或在某处导航),并且只要其状态从外部更新,就会更改历史记录状态而不触发事件。这样,您的视图不再需要了解路由器和/或历史记录对象,这使得它更加透明,负责更改历史状态并在整个应用程序中委派此状态的更改。