Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 传入主干视图的变量未定义_Backbone.js_Underscore.js - Fatal编程技术网

Backbone.js 传入主干视图的变量未定义

Backbone.js 传入主干视图的变量未定义,backbone.js,underscore.js,Backbone.js,Underscore.js,我正在学习主干线/下划线,我发现,我越是脱离教程中真正基本的内容,就越意识到教程并没有教给我很多东西 我当前的问题是向视图传递变量。我有三个不同的模板可用,但它们都呈现相同的效果,所以我希望在从集合中呈现视图时,只将要使用的模板传递到视图中。我认为有效的方法是在视图调用中添加一个属性,然后使用this.options.property访问它,但这会引发一个错误,即该属性未定义 我尝试了许多不同的选择,但似乎没有任何效果。我做错了什么 谢谢是预付款 var ProjectListView = Ba

我正在学习主干线/下划线,我发现,我越是脱离教程中真正基本的内容,就越意识到教程并没有教给我很多东西

我当前的问题是向视图传递变量。我有三个不同的模板可用,但它们都呈现相同的效果,所以我希望在从集合中呈现视图时,只将要使用的模板传递到视图中。我认为有效的方法是在视图调用中添加一个属性,然后使用this.options.property访问它,但这会引发一个错误,即该属性未定义

我尝试了许多不同的选择,但似乎没有任何效果。我做错了什么

谢谢是预付款

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