Javascript 在初始化中可访问的属性在模板中不可访问?
当实例化一个新视图时,我传入一个模型。我可以在“initialize”属性中访问该模型,但在尝试将模型传递到模板时无法引用它。知道为什么吗Javascript 在初始化中可访问的属性在模板中不可访问?,javascript,backbone.js,Javascript,Backbone.js,当实例化一个新视图时,我传入一个模型。我可以在“initialize”属性中访问该模型,但在尝试将模型传递到模板时无法引用它。知道为什么吗 var postView = Backbone.View.extend({ initialize : function() { // returns model console.log('the model we are interested in',this.model);
var postView = Backbone.View.extend({
initialize : function() {
// returns model
console.log('the model we are interested in',this.model);
this.render();
},
el : "#blog-post",
template : function() {
// returns undefined
var model = this.model;
return _.template($('#postview').html(), {
post : model
});
},
render : function() {
var self = this;
this.$el.html(self.template);
}
});
我正在使用另一个视图中的方法对其进行实例化:
readMore : function(e, index) {
var self = this;
var newView = new postView({
model : self.collection.models[index].toJSON()
});
}
您可能正在传递模型,但在视图中没有接收到它。尝试:
initialize: function(model) { ...
最好的猜测是,这不再指视图的上下文。如果您将此记录在函数中,它会显示什么 编辑- 实际上,我不确定这是否会产生预期的结果,我通常使用把手,但我认为u.template和hanblebars的设置非常相似。您的模板通常希望传递一个普通java对象,否则您必须访问您想要的变量,如post.attributes.name,但是如果您只传递模型的toJSON版本,您就可以访问属性,而不需要post.attributes 您还可以编译模板一次,然后引用它,无需将其作为函数放置,每次都从DOM中获取它(假设它从未更改)。下面是我的意思的一个例子。在模板中,您将有etc来获取模型属性。 var postView=Backbone.View.extend({
哦,惯例通常是render返回“this”,因此如果您想从其他地方调用它并将其附加到页面的新部分,可以调用
postView.render().el
将函数传递给this.$el.html
:
this.$el.html(self.template);
this.$el.html(this.template());
// ------------------------^^
这等于说:
var f = this.template;
this.$el.html(f);
那么,当您传递函数时,html
会做什么呢
.html(函数)
返回要设置的HTML内容的函数。接收索引
元素在集合中的位置和旧HTML值
jQuery在调用函数之前清空元素;使用
oldhtml参数引用以前的内容。在
函数,此
引用集合中的当前元素
当您传递html
函数时,它将调用该函数,但此
将不是您所认为的那样,函数中的此
将是正在设置其html的DOM元素
我想您应该自己调用this.template
并将其返回值交给html
:
this.$el.html(self.template);
this.$el.html(this.template());
// ------------------------^^
这样,
template
将按您的期望将视图设置为其this
。Um,当您新建视图({model:…})时,主干视图将自动设置this.model
)
@muistooshort是正确的。这就是我实例化视图的方式。传入模型。就像我说的,当我从“initialize”中记录模型时,我可以看到它。我最终实现的东西有点不同,但从根本上说,这是正确的答案。而不是返回.template(..,我将其设置为变量并返回变量。谢谢您的帮助!