Şu anda bir süredir Backbone uygulamaları geliştiriyorum ve sadece Backire with Require.js kullanmayı öğrenmeye başlıyorum.Backbone/Require Uygulamasındaki paylaşılan nesneler için en iyi uygulama
Düzeltmeyi geri yüklediğim omurga uygulamasında şu şekilde bir ad alanı tanımladım: App.model.repo
. Bu model farklı görüşlerde tekrar tekrar kullanılmıştır. Aynı şeyi birkaç koleksiyonla yapıyorum, örneğin, App.collection.files
. Bu modeller ve koleksiyonlar ilk dizin dosyası isteği ile önyüklenmiştir.
Bu önyükleme verilerini almak için harika bir yol gibi görünen this example buldum. Ancak, bu modelleri ve koleksiyonları görünümler arasında yeniden kullanmanın/paylaşmanın en iyi yolu ile mücadele ediyorum.
Üç olası çözümü düşünebilirim. Hangisi en iyisi ve neden? Yoksa tamamen eksik olduğum başka bir çözüm var mı?
Çözüm 1
endeksinde bu ortak modüller ve koleksiyonları (onlar bootstrapped zaman) tanımlayın ve sonra (initialize
ait) bir seçenek olarak her Backbone görünümüne boyunca onları geçmek.
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
}
});
}
);
Bunlar temiz kadarıyla ayrılması gibi görünüyor, ama işler her tarafa geçirilen tonlarca hızlı korkak alabilir.
Çözüm 2
bir globals
modülünü tanımlayın ve buna yaygın olarak kullanılan modeller ve koleksiyonlar ekleyin.
// 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){
}
});
}
);
Bu çözüm, AMD'nin tüm noktasını bozuyor mu? 3
Çözüm bazı modellerde yapın ve koleksiyonları (etkili onlara Singletons yapma) yerine yapıcı, bir örneğini döndürür.
// 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){
}
});
}
);
Bu benim endişe bir yapıcı ve bir örnek neyi ne olduğu konusunda gerçek kafa karıştırıcı alabilir.
sonu
Buraya kadar okumaya varsa, müthiş! Zaman ayırdığınız için teşekkürler.
Varolan uygulamamı yeniden kodlayarak, 1. ve 3. seçeneklerden birini denedim. Seçenek 1 hızla, her yere ihtiyaç duyulan seçeneklerle, her şeye ihtiyaç duymayan bir modülle, sadece ihtiyaç duyan bir çocuk modülüne ulaşmak için tüylü bir şekilde tüyler üretti. Sonunda, seçenek 3 bana daha temiz geliyor. Gerçek şu ki, şu anki projemde bu seçeneklerin tümünü kullanıyorum. Kısa kullanım ömrü elemanları için Seçenek 1. "ApiUrl" (ortak kök url) gibi basit şeyler için Seçenek 2. Proje çapında kullanılan omurga modelleri ve koleksiyonlar için Seçenek 3. – Bart
Maddi olarak ilgili: http://stackoverflow.com/a/15528785/158651 – Bart