0

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

我目前的问题是将变量传递给视图。我有三个不同的模板可用,但它们都呈现相同的,所以我希望在从集合中呈现它时将要使用的模板传递到视图中。我认为可行的只是在视图调用中添加一个属性,然后使用 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;
    }
  });
4

2 回答 2

1

当你定义你的ProjectView

var ProjectView = Backbone.View.extend({
  //...
  template: _.template($(this.options.projectType).html()),
  //...
});

您正在执行一些代码(即调用extend),在这种情况下,this将是全局对象(window浏览器中的又名),并且可能没有options属性。如果要使用projectType传递给ProjectView构造函数的选项,请将template赋值移动到initialize

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.

于 2013-07-22T06:26:42.340 回答
-1

mu is too short是正确的,如果您template按如下方式定义方法,则可以template与以下所有实例共享该方法ProjectView

var ProjectView = Backbone.View.extend({
  tagName: "div",
  className: "project-wrap",
  render: function() {
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  },
  template: function() {
    return _.template($(this.options.projectType).html());
  }
});
于 2013-07-22T13:43:43.607 回答