2

问题是我想渲染带有值属性集的选项元素以及文本节点。

因此,在我的 ItemView 中将 tagName 设置为 option 不仅仅是这样做的。我目前的解决方案是将其设置为选项,然后在 ItemView 构造函数中使用以下代码来设置值属性:

 onRender: function () {
            this.$el.attr('value', this.model.get('name'));
        }

这行得通。

但是有没有别的办法?

我真正想做的只是告诉 Marionette 根本不要输出一个元素,然后在我的 ItemView 模板中有这个:

<option value="<%= name %>"> <%= name %> </option>

这可能吗?

4

3 回答 3

0

我不确定您是否应该出于各种不同的原因。

但我知道,在单个标签视图的用例中,Marionette/Backbone 的工作方式是您创建另一个标签并拥有一个视图,或者您使用 onRender 和查询来更新已经为您生成的单个标签。

您可以拥有一个扩展 ItemView 的对象,我们称之为 SingleTagView。基本上我正在扩展 ItemView 并使用一次更改来超越它的渲染功能。

而不是这样做:

this.$el.html(html);

我在做:

var $html = $(html);
this.$el.replaceWith($html);
this.setElement($html);

这是代码:

var SingleTagView = Marionette.ItemView.extend({
 render: function() {
  this.isClosed = false;

  this.triggerMethod("before:render", this);
  this.triggerMethod("item:before:render", this);

  var data = this.serializeData();
  data = this.mixinTemplateHelpers(data);

  var template = this.getTemplate();
  var html = Marionette.Renderer.render(template, data);
  // above is standart ItemView code
  var $html = $(html);
  this.$el.replaceWith($html);
  this.setElement($html);
  // this code above replaced this.$el.html(html);
  // below is standart ItemView code
  this.bindUIElements();

  this.triggerMethod("render", this);
  this.triggerMethod("item:rendered", this);

  return this;
}
});

如果要使用这种角度,请确保正确测试行为(事件处理、Dom 泄漏、使用 before:render 事件的不同流程)。

于 2013-07-03T13:50:12.193 回答
0

It's possible but a bit fiddly, by default Backbone always uses a wrapper element (definable by using tagName) but you'd have to expressly populate the attributes (as you are doing above).

It is however possible to circumvent the wrapper element using a slightly convoluted setElement approach and this will enable you keep all markup in a template with attributes on the root node populated from the model. I like this approach as well since I personally think it keeps a clearer separation of concerns.

Take a look here for an example - Backbone, not "this.el" wrapping

Not sure if Marionette has a build in mechanism for doing this.

于 2013-07-03T13:36:49.127 回答
0

我会尝试:

var optionTag = Marionette.ItemView.extend({
  tagName: "option",

  initialize: function(){
    this.attributes = {
      value: this.model.get('name');
    }
  }
}

然后 Backbone 应该完成剩下的工作(即将 的内容attributes放入 HTML 标记中)...

于 2013-07-03T14:24:51.200 回答