2012-05-29 1 views
0

Я загружаю все мои важные данные в моем базовом приложении при загрузке начальной страницы. Это в основном коллекции. Некоторое время я застрял в проблеме, когда я звонил collection.get(id), но он возвращал undefined, хотя я знал, что существует модель с атрибутом ID прошедшего идентификатора.Правильный способ загрузки базы данных с базой данных с данными на загрузку страницы

Затем, когда я осмотрел коллекцию в консоли, я заметил, что массив _byId, который должен содержать массив идентификаторов моих моделей, пуст.

Ниже вы можете увидеть, что в коллекции есть модели, и у этих моделей есть атрибут идентификатора.

window.campaigns 
child 
    _byCid: Object 
    _byId: Object 
    __proto__: Object 
    _callbacks: Object 
    length: 32 
    models: Array[32] 
    models: Array[32] 
    0: child 
    _callbacks: Object 
    _escapedAttributes: Object 
    _pending: Object 
    _previousAttributes: Object 
    _silent: Object 
    attributes: Object 
    DateCreated: "23/05/2012" 
    DateScheduled: "" 
    DateSent: "" 
    Description: null 
    From: null 
    ID: 1 
    IsAllowed: false 
    Message: null 
    Name: "Some name" 
    __proto__: Object 
    changed: Object 
    cid: "c0" 
    collection: child 
    __proto__: ctor 
    1: child 
    2: child 
    3: child 
    4: child 
    5: child 
    length: 6 
    __proto__: Array[0] 
    __proto__: ctor 

Я самонастройки данные, используя массив объектов JSON, которые написаны на моей странице индекса на странице загрузки. Я предположил, что это все, что вам нужно было сделать, и Backbone предположил бы, что свойство, называемое «ID», является идентификатором модели и будет соответствующим образом интерпретировать.

Я ошибаюсь, думая об этом/я делаю это правильно?

ответ

6

Я вижу это в модели:

ID: 1 

JavaScript чувствителен к регистру, так id и ID разные вещи; Backbone ищет id по умолчанию и ничего не знает о ID.

Если вы используете id, то все будет работать из коробки:

​var M = Backbone.Model.extend({}); 
var C = Backbone.Collection.extend({ 
    model: M 
}); 
​var c = new C([ 
    { id: 1, str: 'where' }, 
    { id: 2, str: 'is'  }, 
    { id: 3, str: 'pancakes' }, 
    { id: 4, str: 'house?' } 
]); 

Демо: http://jsfiddle.net/ambiguous/nzLEC/

Или вы могли бы рассказать свою модель, чтобы использовать другой атрибут для id с помощью idAttribute:

IDAttributemodel.idAttribute

Уникальный идентификатор модели хранится под атрибутом id. Если вы напрямую общаетесь с бэкэнд (CouchDB, MongoDB), который использует другой уникальный ключ, вы можете установить idAttribute модели для прозрачной карты с этого ключа на id.

В первом предложении описания может быть лучше, как сформулировано

уникальный идентификатор модели, хранятся под idсобственности.

, чтобы избежать некоторых из общей путаницы между JavaScript объектами свойствами и Backbone моделью атрибутами.

Например:

var M = Backbone.Model.extend({ 
    idAttribute: 'ID' 
}); 
var C = Backbone.Collection.extend({ 
    model: M 
}); 
var c = new C([ 
    { ID: 1, str: 'where' }, 
    { ID: 2, str: 'is'  }, 
    { ID: 3, str: 'pancakes' }, 
    { ID: 4, str: 'house?' } 
]); 

Демо: http://jsfiddle.net/ambiguous/3NhGV/

+0

спасибо за это. эпический ответ! если бы я всегда получал ответ на этот вопрос. он действительно решил мою проблему, я ошибочно полагал, что позвоночник будет использовать конвенционный подход, где любая форма id будет работать, но, очевидно, нет! – jcvandan