在下划线模板中渲染对象

Render object in underscore template

本文关键字:对象 下划线      更新时间:2023-09-26

tl;dr
我将一组项呈现到主干视图中,将它们传递到数组中的父视图,并尝试在下划线模板中显示它们。我得到的不是html,而是[object HtmlDivElement]

完整描述

我有一种视图生成器,这样:

  1. 我从后台接收数据
  2. 我逐行将其发送到视图生成器
  3. 我收到渲染视图

该过程的重点是接收来自不同来源的一般处理响应,其中需要对来自每个来源的数据进行不同的解析。我知道并已经根据请求为每个集合定义了解析方法。

相关代码:

var ResultGroupView = Backbone.View.extend({
    tagName: 'tbody',
    initialize: function (options) {
        var self = this;
        self.collection = new ResultGroupModel();
        self.parent = options.parent;
        self.collection.bind('add', self.renderItem, self);
        _.bindAll(self, 'render', 'renderItem', 'addItem');
        [...]
    }
    template: _.template(resultGroupTemplate),
    addItem: function (item) {
        var self = this;
        var values = [];
        //a new item is being added to the collection. get the details on how to parse it
        _(self.parent.getColumns()).each(function (v) {
            values.push(((!!v.parser) ? v.parser.call(self, item[v.Id]) : item[v.Id]));
        });
        //due to the binding above, this next line triggers the renderItem function
        self.collection.add(new ResultItemModel({ Id: item.Id, Values: values }));
    },
    renderItem: function (item) {
        var self = this;
        //ResultItemView has tagName: 'tr'
        var itemView = new ResultItemView({
            model: item,
            parent: self
        });
        self.$el.append(itemView.render().el);
    },
    [...]
});

每种类型的数据都定义了不同的parser函数。具体来说,在我们有v.parser.call(self, item[v.Id])的地方,这是对视图生成器的调用。解析器只是创建一个主干View并返回渲染的对象。

上面提到的ResultItemView只是在下划线模板上呈现其视图,该模板为:

<td><input type="checkbox" value="<%=Id%>" /></td>
<% _.each(Values, function(Val) { %>
    <td>
        <%=Val%>
    </td>
<% }); %>

最后显示的内容是<%=Val%>[object HtmlImgElement][object HtmlDivElement]等等

显然,我对如何在视图和模板之间传递信息的理解存在一些基本错误。。。但我不知道需要改变什么。

我觉得使用类似node.outerHTML || new XMLSerializer().serializeToString(node);的东西(如本文所述)相当粗糙。。。有更好的方法吗?

我怀疑你想得太多了。在你的renderItem方法中,改变。。。

self.$el.append(itemView.render().el);

self.$el.append(itemView.render().$el.html());