我正在学习Backbone.js,并试图弄清楚是否可以在Backbone视图中使用实例变量。
我的目标是在实例化视图时从外部文件加载视图的模板。目前我将它们存储在Backbone应用程序的全局命名空间中的全局变量中,但将模板存储在视图的实例变量中会更清晰。目前我的设置如下:
var templates = {};
MessageView = Backbone.View.extend({
initialize: function() {
$.get('js/Test2Templates.tpl', function(doc) {
var tmpls = $(doc).filter('template');
templates['MessageView'] = [];
tmpls.each(function() {
templates.MessageView[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
});
});
},
render: function() {
var tpldata = {name: 'Ville', thing: 'Finland'};
$('#display').jqoteapp(templates.MessageView.greeting_template, tpldata);
},
events: {
"click input[type=button]": "additionalTransactions"
},
additionalTransactions: function() {
this.render();
}
});
但是我没有将“模板”定义为全局变量,而是想在视图的初始化函数中创建“模板”,沿着这些行(但这不起作用):
MessageView = Backbone.View.extend({
view_templates: {},
initialize: function() {
$.get('js/Test2Templates.tpl', function(doc) {
var tmpls = $(doc).filter('template');
tmpls.each(function() {
this.view_templates[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
});
});
},
render: function() {
var tpldata = {name: 'Ville', thing: 'Suomi'};
$('#display').jqoteapp(this.view_templates.greeting_template, tpldata);
},
events: {
"click input[type=button]": "additionalTransactions"
},
additionalTransactions: function() {
this.render();
}
});
这可能(?)非常直接和/或显而易见,但我在Backbone.js学习曲线的某个地方,我非常感谢任何帮助!谢谢!
答案 0 :(得分:17)
您的view_templates
实例变量很好(也是个好主意)。您只需确保在this
回调中和$.get()
来电中使用正确的tmpls.each()
。我想你希望initialize
更像这样:
initialize: function() {
this.view_templates = { };
var _this = this;
$.get('js/Test2Templates.tpl', function(doc) {
var tmpls = $(doc).filter('template');
tmpls.each(function() {
_this.view_templates[this.id] = $.jqotec($.unescapeHTML(this.innerHTML));
});
});
},
我不确定this.id
中你想要哪个tmpls.each()
,但我猜你想要当前模板中的DOM id
属性,所以我把它留给了this.id
1}}。
您的构造函数(this.view_templates
)中的initialize
赋值是必需的,因为您可能希望视图的每个实例都拥有自己的数组副本。创建新的视图实例不会对视图执行深层复制,因此如果您只有:
MessageView = Backbone.View.extend({
view_templates: {},
// ...
然后所有实例最终将共享相同的view_templates
对象,而view_templates
的行为更像是类变量而不是实例变量。
您可以在视图定义中指定实例变量(即Backbone.View.extend()
调用)作为文档的一种形式,但您需要初始化任何应该在{{1}中作为实例变量运行的实例变量} 方法;像initialize
这样的只读或“类变量”可以作为视图定义的一部分。