0

我正在学习 JavaScript 和 Backbone.js。现在我正在阅读Addy Osmani在 Backbone.js 中的 Todo 应用程序示例,并与以下部分混淆:

// We keep the Todos in sequential order, despite being saved by unordered
// GUID in the database. This generates the next order number for new items.
nextOrder: function() {
    if ( !this.length ) {
        return 1;
    }
    return this.last().get('order') + 1;
},

// Todos are sorted by their original insertion order.
comparator: function( todo ) {
    return todo.get('order');
}

事实上,我在其他任何'order'地方都没有找到任何属性,谁能指出它是如何get('order')工作的?

4

2 回答 2

1

查看调用 nextOrder 的位置:

var Todo = Backbone.Model.extend({
  defaults: function() {
    return {
      title: "empty todo...",
      order: Todos.nextOrder(),
      done: false
    };
  },

我们在这里设置模型的顺序。如果没有任何现有订单,则将其设置为 1。如果有,则最后一个订单具有迄今为止的最高索引。

于 2013-01-03T04:40:55.627 回答
1

快速浏览一下来源get将是有益的:

get: function(attr) {
  return this.attributes[attr];
}

所以当你说的时候m.get('a'),Backbone 会'a'往里面找m.attributes。这里的重要教训是 Backbone 模型属性和 JavaScript 对象属性不是一回事:你使用访问属性am.get('a')而属性p是通过m.p. 将属性和属性分开的原因有很多,其中几个主要的原因是:

  1. 您不希望模型属性与属性和方法发生命名冲突。
  2. 您想知道模型的哪些部分应该被持久化到服务器并发送到模板以进行渲染(参见注释源toJSON中的和)。

另一个教训是,一旦您具备 JavaScript 的基本知识,Backbone 源代码实际上是非常易读且相当容易理解的。当您不了解 Backbone 内部结构时,带注释的源代码很方便。

于 2013-01-03T04:59:44.680 回答