// Models
company.models.Employee = Backbone.Model.extend({
defaults: {
id: undefined,
name: undefined
}
});
// Collections
company.collections.Department = Backbone.Collection.extend({
model: company.models.Employee
});
// Views
company.views.EmployeeList = Backbone.View.extend({
el: "#container",
render: function() {
...
}
});
// Create base data
var c = new company.collections.Department(
[{id:1, name: "Star Willard"},
{id:2, name: "Rhona Eggleston"},
{id:3, name: "Cassi Chowdhury"},
{id:4, name: "Leigh Nilson"},
{id:5, name: "Niesha Auger"}
]);
// Create view
var v = new company.views.EmployeeList({collection: c});
v.render();
以下就來探討 render function 該怎麼把 collection 套用到 template 並呈現在 UI 上
方法一:土法煉鋼,串成 string
這種方法當然是很差啦,程式可讀性下降,也很難維護
Render function in app.js
render: function() {
var that = this;
this.collection.each(function(m) {
var html = "<div>" +
"" + m.get("id") + " " +
"" + m.get("name") + "" +
"</div>";
that.$(".list").append(html);
});
return this;
}
方法二:寫在 stript 內
利用 underscore.js template engine
比前一種好一點點,但還是有缺點,沒有把 template 切出去,一方面 IDE 的 syntax 會失效
in index.html
<script id="template-item" type="text/template">
<div>
<b><%= id %></b>
<u><%= name %></u>
</div>
</script>
Render function in app.js
template: _.template($("#template-item").html()),
render: function() {
var that = this;
this.collection.each(function(m) {
that.$(".list").append(that.template(m.toJSON()));
});
return this;
}
方法三:從獨立的 html 檔案中讀取
把 template 寫在個別的 html 檔,利用 ajax 的方式去 load。
程式碼較好管理,但每讀取一次 template 就要多發一個 http request
tpl/template-item.html
<%= id %> <%= name %>
Add the template manager to app.js
其實只是把 get request 包起來啦
company.utils.TemplateManager = {
load: function(name, callback) {
$.get('tpl/' + name + '.html', function(data) {
callback(data);
});
}
};
Render function in app.js
render: function() {
var that = this;
company.utils.TemplateManager.load('template-item', function(data) {
var tpl = _.template(data);
that.collection.each(function(m) {
that.$(".list").append(tpl(m.toJSON()));
});
});
return this;
}
方法四:Asynchronously load template
與其說是非同步,正確來說應該是預先載入(preload),之後使用時就可以直接從 local variable 取出,加快反應速度,也可以省去從 server 抓取相同 template 的功耗
TemplateLoader in app.js
company.utils.TemplateManager = {
templates: {},
load: function(names) {
var that = this;
$.each(names, function(index, name) {
$.get('tpl/' + name + '.html', function(data) {
that.templates[name] = data;
});
});
},
get: function(name, callback) {
return this.templates[name];
}
};
Render function in app.js
render3: function() {
var that = this;
var tpl = _.template(company.utils.TemplateManager.get('template-item'));
this.collection.each(function(m) {
that.$(".list").append(tpl(m.toJSON()));
});
}
in app.js
Preload the template before render the view.
company.utils.TemplateManager.load(['template-item', 'other-template']);
var v = new company.views.EmployeeList({collection: c});
v.render();
如果要保證全部的 template 都載入才進行之後的事情,可以使用 jquery.when()
load: function(names, callback) {
var deferreds = [];
var that = this;
$.each(names, function(index, name) {
deferreds.push($.get('tpl/' + name + '.html', function(data) {
that.templates[name] = data;
}));
});
$.when.apply(null, deferreds).done(callback);
}
參考資料
E31972DA1E
回覆刪除hacker kirala
hacker kiralama
tütün dünyası
hacker bul
hacker kirala
38DDA0F5
回覆刪除Şırnak
Urfa
Maraş
Trabzon
Bingöl
Muş
Nevşehir
Tokat
Kilis
714B5942
回覆刪除Tokat
Iğdır
Bolu
Çorum
Artvin
Erzurum
Malatya
Bartın
Kırıkkale