2015-06-08 4 views
0

От чтения учебника под названием «Разработка приложений Backbone.js» Адди Османи и опробования практического примера на нем, я может видеть, что все элементы класса Backbone.Collection могут иметь элементы разных типов. Класс, расширяющий Backbone.Collection, также может содержать различные типы элементов, так как все элементы не обязательно должны быть согласованными.Backbone.js: класс «Backbone.Collection», поддерживающий объекты разных типов, и как работает класс

Позвольте мне показать вам код, я использую для моего примера:

var ToDosCollection = new Backbone.Collection(); 

ToDosCollection.add([ 
    { title: 'go to Jamaica.', completed: false }, 
    { task: "aldvjalkdgj", level: 3, timeDue: "6:00 PM Today" } 
]); 

console.log('Collection size: ' + ToDosCollection.length); 
ToDosCollection.reset([ 
    { slogan: "Curse you, Sephiroth.", population: 5500,}, 
    { project: "Final Fantasy X" }, 
    { amount: 500 } 
]); 

// Above logs 'Collection reset.' 
console.log('Collection size: ' + ToDosCollection.length); 
alert(JSON.stringify(ToDosCollection.get(0))); 

var GitHubRepository = Backbone.Model.extend({ 
     defaults: { 
     nameOfRepository : "", 
     owner : "", 
     members : [], 
     dateCreated : "", 
     commits: 0, 
     additions: 0, 
     deletions: 0, 
    }, 

    initialize : function(){ 
     this.on("change", function() { 
     console.log("CHANGE DETECTED"); 
    }); 

    this.on("change:nameOfRepository", function(){ 
     console.log("The name of the repository has been changed."); 
    }); 

    this.on("change:owner", function(){ 
     console.log("The owner of the repository has been changed."); 
    }); 

    this.on("change:members", function(){ 
     console.log("The members this repository belongs to have been changed."); 
    }); 

    this.on("change:dateCreated", function(){ 
     console.log("The date this repository was created has been changed."); 
    }); 

    this.on("change:commits", function(){ 
     console.log("The # of commits this repository has have been changed."); 
    }); 

    this.on("change:additions", function(){ 
     console.log("The # of additions this repository has have been changed."); 
    }); 

    this.on("change:deletions", function(){ 
     console.log("The # of deletions this repository has have been changed."); 
     }); 
    } 
}); 

var GitHubRepositoryCollection = Backbone.Collection.extend({ 
    model: GitHubRepository 
}); 

var newCollection = new GitHubRepositoryCollection(); 

newCollection.add(
    {newObject: new GitHubRepository()}, 
    {title: "Rabbits"}, 
    {elementNumber: 5} 
); 

Могу ли я понять это правильно? Или, для некоторого понимания, как это работает? Мне кажется, что я делаю это аналогичным экземпляру ArrayList в Java, который поддерживает объекты Object.

EDIT: Учитывая, что я получил хотя бы один отрицательный голос по этому вопросу, я хотел бы спросить: «Как работает ItemView в Backbone.js?»

+0

Насколько я понял, конкретная коллекция может содержать только массив определенных моделей (например, ваш 'GitHubRepositoryCollection'), а неспецифическая коллекция может содержать что угодно. См. Это из справочной документации: "collection.model: Переопределите это свойство, чтобы указать класс модели, который содержит коллекция. Если задано, вы можете передавать объекты необработанных атрибутов (и массивы) для добавления, создания и сброса, а также атрибуты будут преобразованы в модель соответствующего типа ». – m4lt3

ответ

0

Для того, чтобы визуализировать itemview для каждой модели в коллекции, я думаю, что лучше придерживаться каждой модели аналогично. В противном случае вам придется создавать элементы для каждой модели по-разному, что увеличит ваши накладные расходы, чтобы написать код, который не является хорошим, потому что мы должны использовать магистраль, чтобы визуализировать представления, которые должны отображаться для одних и тех же данных таким же образом. Если вы хотите визуализировать разные элементы item, всегда лучше иметь разные представления композиций или коллекций, которые автоматизируют вашу задачу по рендерингу itemview, что в конечном итоге уменьшит ваши накладные расходы.

+0

Я новичок в ItemView. – GregPDesJav

+0

@GregPDesJav Itemview - это представление, которое позвоночник создает самостоятельно для каждой модели в коллекции, при условии, что вы предоставили itemview и itemviewcontainer в коллекции или составном виде –

+0

@nikhilmehta, что вы смешиваете марионетку и позвоночник. Marionette - это расширение для просмотра и архивирования для магистрали. Сама магистральная система не поддерживает просмотр элементов – m4lt3