Javascript 在初始化中可访问的属性在模板中不可访问?

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);

当实例化一个新视图时,我传入一个模型。我可以在“initialize”属性中访问该模型,但在尝试将模型传递到模板时无法引用它。知道为什么吗

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(..,我将其设置为变量并返回变量。谢谢您的帮助!