Я разрабатываю Backbone-приложения на некоторое время, и только начинаю учиться использовать Backbone с Require.js.
В моем базовом приложении, которое я рефакторинг, я определил пространство имен, подобное этому: App.model.repo
. Эта модель используется снова и снова в разных представлениях. Я делаю то же самое с несколькими коллекциями, например, App.collection.files
. Эти модели и коллекции загружаются с исходным запросом файла индекса.
Я нашел этот пример, который выглядит как отличный способ получить эти загрузочные данные. Однако я изо всех сил стараюсь использовать их повторно моделей и коллекции между представлениями.
Я могу думать о трех возможных решениях. Что лучше и почему? Или есть другое решение, которое я полностью потерял?
Решение 1
Определите эти общие модули и коллекции в индексе (когда они загружаются), а затем передайте их каждому представлению Backbone в качестве опции (initialize
).
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html'],
function($, _, Backbone, Handlebars, template){
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
this.repoModel = options.repoModel; // common model passed in
}
});
}
);
Они кажутся чистыми до разделения, но могут быстро стать напуганными, и тонны вещей передаются повсюду.
Решение 2
Определите модуль globals
и добавьте к нему обычно используемые модели и коллекции.
// models/Repo.js
define(['backbone'],
function(Backbone){
return Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
// globals.js (within index.php, for bootstrapping data)
define(['underscore', 'models/Repo'],
function(_, RepoModel){
var globals = {};
globals.repoModel = new Repo(<?php echo json_encode($repo); ?>);
return globals
}
);
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html', 'globals'],
function($, _, Backbone, Handlebars, template, globals){
var repoModel = globals.repoModel; // repoModel from globals
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
}
});
}
);
Означает ли это решение всю цель AMD?
Решение 3
Сделайте несколько моделей и коллекций, возвращающих экземпляр вместо конструктора (эффективно создавая синглтоны).
// models/repo.js
define(['backbone'],
function(Backbone){
// return instance
return new Backbone.Model.extend({
idAttribute: 'repo_id'
});
}
);
// Included in index.php for bootstrapping data
require(['jquery', 'backbone', 'models/repo', 'routers/Application'],
function($, Backbone, repoModel, ApplicationRouter){
repoModel.set(<?php echo json_encode($repo); ?>);
new ApplicationRouter({el: $('.site-container')});
Backbone.history.start();
}
);
define(['jquery', 'underscore', 'backbone', 'handlebars', 'text!templates/NavBar.html', 'models/repo'],
function($, _, Backbone, Handlebars, template, repoModel){
// repoModel has values set by index.php
return Backbone.View.extend({
template: Handlebars.compile(template),
initialize: function(options){
}
});
}
);
Это, я беспокоюсь, может смутить насчет того, что такое конструктор и что такое экземпляр.
End
Если вы читаете это далеко, вы потрясающий! Спасибо, что нашли время.