2013-01-03 26 views
0

我正在學習JavaScript和Backbone.js。現在,我通過阿迪·奧斯馬尼閱讀Todo application example in Backbone.js,並混淆以下部分:get('order')如何工作?

// 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')工作?

回答

1

退房哪裏nextOrder被稱爲:

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

我們在這裏設置模式的順序。如果沒有任何現有訂單,則將其設置爲1.如果存在任何訂單 - 最後一個訂單的索引迄今爲止最高。

+0

謝謝。最後在app.js中找到它,它會在創建項目時添加到待辦事項中。有點困惑爲什麼不在模型中聲明它? – Sin

1

就讓我們來看看在source for get將是有益的:

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

所以,當你說m.get('a'),骨幹會尋找'a'm.attributes。這裏最重要的一點是Backbone模型屬性和JavaScript對象屬性不是一回事:您使用m.get('a')訪問屬性a,而通過m.p訪問屬性p。分離屬性和屬性的原因有很多種,其中幾個主要原因是:

  1. 您不希望模型屬性與屬性和方法發生命名衝突。
  2. 您想知道模型的哪些部分應該保存到服務器併發送到模板進行渲染(請參閱toJSONannotated source)。

另一個教訓是,一旦您擁有JavaScript的基本知識,Backbone源代碼實際上非常易讀並且相當容易理解。當你不知道自己的主幹內部時,annotated source很方便。