Backbone.js 传入主干视图的变量未定义
我正在学习主干线/下划线,我发现,我越是脱离教程中真正基本的内容,就越意识到教程并没有教给我很多东西 我当前的问题是向视图传递变量。我有三个不同的模板可用,但它们都呈现相同的效果,所以我希望在从集合中呈现视图时,只将要使用的模板传递到视图中。我认为有效的方法是在视图调用中添加一个属性,然后使用this.options.property访问它,但这会引发一个错误,即该属性未定义 我尝试了许多不同的选择,但似乎没有任何效果。我做错了什么 谢谢是预付款Backbone.js 传入主干视图的变量未定义,backbone.js,underscore.js,Backbone.js,Underscore.js,我正在学习主干线/下划线,我发现,我越是脱离教程中真正基本的内容,就越意识到教程并没有教给我很多东西 我当前的问题是向视图传递变量。我有三个不同的模板可用,但它们都呈现相同的效果,所以我希望在从集合中呈现视图时,只将要使用的模板传递到视图中。我认为有效的方法是在视图调用中添加一个属性,然后使用this.options.property访问它,但这会引发一个错误,即该属性未定义 我尝试了许多不同的选择,但似乎没有任何效果。我做错了什么 谢谢是预付款 var ProjectListView = Ba
var ProjectListView = Backbone.View.extend({
el: '#projectList',
initialize: function() {
this.collection = masterProjectList;
this.render();
},
render: function() {
this.$el.html("");
this.collection.each(function(project) {
this.renderItem(project);
}, this);
},
renderItem: function(project) {
var projectView = new ProjectView({model: project, projectType: '#theatricalProjectTemplate' });
// Passing in the project type, which determines which template gets used
this.$el.append(projectView.render().el);
}
});
var ProjectView = Backbone.View.extend({
tagName: "div",
className: "project-wrap",
template: _.template($(this.options.projectType).html()),
// use this.options to access the value
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
定义
项目视图时
:
var ProjectView = Backbone.View.extend({
//...
template: _.template($(this.options.projectType).html()),
//...
});
您正在执行某些代码(即调用extend
),在此上下文中,this
将是全局对象(在浏览器中称为窗口
),并且可能没有选项
属性。如果要使用传递给项目视图
构造函数的项目类型
选项,请将模板
赋值移动到初始化
:
var ProjectView = Backbone.View.extend({
tagName: "div",
className: "project-wrap",
initialize: function() {
this.template = _.template($(this.options.projectType).html());
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
这假设
projectType
将是一个有效的jQuery选择器,您可能希望使用'#'+This.options.projectType
,但我不确定projectType
mu太短
是正确的,如果您定义模板
方法如下,您可以将模板
方法与项目视图
的所有实例共享:
var ProjectView = Backbone.View.extend({
//...
template: _.template($(this.options.projectType).html()),
//...
});
var ProjectView=Backbone.View.extend({
标记名:“div”,
类名:“项目包装”,
render:function(){
this.el.html(this.template(this.model.toJSON());
归还这个;
},
模板:函数(){
返回u.template($(this.options.projectType).html());
}
});
当您使用\uu.template($(this.options.projectType).html())
时,您认为这个
是什么?我假设它指的是正在创建的单个视图,即该视图中存在的变量和状态。我是不是把U和MED弄得一团糟了?呃,别难过-我看着它,没有意识到发生了什么。你的模板是什么样子的?你应该看到我犯的一些错误:)也许值得一提的是,通过将模板编译移到initialize
中,你最终会为每个projectView编译模板。根据有多少个项目,最好将三个模板编译一次,然后将actaul编译的模板传递给视图。@Jack:或者设置一个单独的“模板管理器”对象在第一次使用时编译和缓存模板,或者在部署期间编译所有模板,并将其索引到模板函数的全局JST
数组中。这样做了。谢谢虽然我已经弄明白了这一点,但我仍然需要研究它。@muistooshort-True,我更关注的是编译它一次,而不是编译每个视图实例。我说要传递它,因为据我所知,OP希望能够在实例化视图时决定使用哪个模板。您不想说this.template()(this.model.toJSON())
?