Javascript Backbone.js视图属性中的变量
我试图通过在视图中使用模型的属性作为变量来呈现HTML块Javascript Backbone.js视图属性中的变量,javascript,backbone.js,attributes,underscore.js,Javascript,Backbone.js,Attributes,Underscore.js,我试图通过在视图中使用模型的属性作为变量来呈现HTML块 App = Backbone.Model.extend({ contentType: "text" }); AppView = Backbone.View.extend({ ContentTpl: _.template( $('#slide-'+this.model.get('contentType')).html() ), render: function(){
App = Backbone.Model.extend({
contentType: "text"
});
AppView = Backbone.View.extend({
ContentTpl: _.template( $('#slide-'+this.model.get('contentType')).html() ),
render: function(){
$('#wrapper').html( this.ContentTpl() );
}
});
var app = new App();
var appView = new AppView({model: app});
appView.render();
HTML:
这是一个测试
但这会导致错误…您将视图定义错误 你有
AppView = Backbone.Model.extend({
应该是
AppView = Backbone.View.extend({
并且,在初始化视图之前,您无法计算this.model,请改为执行以下操作:
ContentTpl: function() {
return _.template( $('#slide-'+ this.model.contentType).html() );
},
而且,contentType不是模型属性,它是模型对象上的属性,不能使用get()
要将其定义为模型属性,您必须将其定义为模型中的默认值,或者在实例化对象时传递它:
var app = new App({contentType: 'text'});
或
你把你的观点定义错了 你有
AppView = Backbone.Model.extend({
应该是
AppView = Backbone.View.extend({
并且,在初始化视图之前,您无法计算this.model,请改为执行以下操作:
ContentTpl: function() {
return _.template( $('#slide-'+ this.model.contentType).html() );
},
而且,contentType不是模型属性,它是模型对象上的属性,不能使用get()
要将其定义为模型属性,您必须将其定义为模型中的默认值,或者在实例化对象时传递它:
var app = new App({contentType: 'text'});
或
您必须在
initialize
函数中加载模板<代码>此时不存在此.model
initialize: function() {
this.ContentTpl = _.template( $('#slide-'+this.model.get('contentType')).html() );
}
然而,这仍然是一个不好的模式形式主干。我会把它作为一种选择
var template = $('#slide-'+this.model.get('contentType')).html();
var appView = new AppView({model: app, ContentTpl: template });
...
// in your view
initialize: function(options) {
this.ContentTpl = _.template( options.ContentTpl );
}
您必须在
initialize
函数中加载模板<代码>此时不存在此.model
initialize: function() {
this.ContentTpl = _.template( $('#slide-'+this.model.get('contentType')).html() );
}
然而,这仍然是一个不好的模式形式主干。我会把它作为一种选择
var template = $('#slide-'+this.model.get('contentType')).html();
var appView = new AppView({model: app, ContentTpl: template });
...
// in your view
initialize: function(options) {
this.ContentTpl = _.template( options.ContentTpl );
}
你得到了什么错误?未捕获类型错误:无法调用未定义的方法“get”你得到了什么错误?未捕获类型错误:无法调用未定义的方法“get”,我在帖子中忘记了这一点。当然,我的代码中有'this.ContentTpl()'。我编辑了我的第一篇博文,这背后的真正含义是,当您通过执行AppView=Backbone.view.extend({})来定义视图时。。。javascript将评估您在AppView对象中定义的每个属性。(它将尝试运行u.template(…))您甚至会在实际实例化视图之前就发现错误,因为此.model不可用。如果您将其定义为函数,javascript会知道ContentTpl是一个函数,在您告诉它之前,它不会运行它。您的代码会导致jQuery警告:event.returnValue已弃用。请改用标准的event.preventDefault()。我可以忽略这一点吗?这只是因为我在JSFIDLE中使用了非常旧的jquery版本。:)试试这个:我将下划线、backbonejs和jquery更改为最新版本。sry,我在帖子中忘记了这一点。当然,我的代码中有'this.ContentTpl()'。我编辑了我的第一篇博文,这背后的真正含义是,当您通过执行AppView=Backbone.view.extend({})来定义视图时。。。javascript将评估您在AppView对象中定义的每个属性。(它将尝试运行u.template(…))您甚至会在实际实例化视图之前就发现错误,因为此.model不可用。如果您将其定义为函数,javascript会知道ContentTpl是一个函数,在您告诉它之前,它不会运行它。您的代码会导致jQuery警告:event.returnValue已弃用。请改用标准的event.preventDefault()。我可以忽略这一点吗?这只是因为我在JSFIDLE中使用了非常旧的jquery版本。:)试试这个:我将下划线、backbonejs和jquery更改为最新版本。@FLuttenb它不是全局的,而是实例属性。你可以使用
渲染来实现它。ContentTpl
。这是个坏主意,因为我有很多这样的模板,我想在我的主干模型中保留尽可能多的代码。@FLuttenb一个模型并不是存储模板的理想之选。所以一般来说,在主干模型/视图之外创建模板是一个好主意吗然后作为一个选项加载它?如果我有大约10个模板怎么办?@FLuttenb另外,this
(视图)的model
属性是一个实例属性。@FLuttenb它不是全局的,而是一个实例属性。你可以使用渲染来实现它。ContentTpl
。这是个坏主意,因为我有很多这样的模板,我想在我的主干模型中保留尽可能多的代码。@FLuttenb一个模型并不是存储模板的理想之选。所以一般来说,在主干模型/视图之外创建模板是一个好主意吗然后作为一个选项加载它?如果我有大约10个模板呢?@FLuttenb另外,this
(视图)的model
属性是一个实例属性。