3

codeschool.com Backbone 课程的第 7 级有以下代码,并声明整个事情可以使用以下 jquery 开始

$(function(){ TodoApp.start() })

这将调用Backbone.history.start. 但是如何调用Backbone.history.start最终导致index被调用以便fetch调用以填充模型集合todoList

var TodoApp = new (Backbone.Router.extend({
  routes: { "": "index", "todos/:id": "show" },
  initialize: function() {
    this.todoList = new TodoList();
    this.todosView = new TodoListView({collection: this.todoList});
    $('#app').append(this.todosView.el);
  },
  start: function(){
    Backbone.history.start({pushState: true});
  },
  index: function(){
    this.todoList.fetch();
  },
  show: function(id){
    this.todoList.focusOnTodoItem(id);
  }
}));
4

1 回答 1

4

如果您查看Backbone 源代码,您可以看到正在发生的事情。

在 的末尾History.start,您可以看到它调用了loadUrl,如下所示:

// Attempt to load the current URL fragment. If a route succeeds with a
// match, returns `true`. If no defined routes matches the fragment,
// returns `false`.
loadUrl: function(fragmentOverride) {
  var fragment = this.fragment = this.getFragment(fragmentOverride);
  var matched = _.any(this.handlers, function(handler) {
    if (handler.route.test(fragment)) {
      handler.callback(fragment);
      return true;
    }
  });
  return matched;
},

当您添加路线时,它们会添加到this.handlers. 由于有一个与“索引”匹配的处理程序,因此调用了该回调。

于 2013-02-15T02:00:00.377 回答