Backbone:视图中的视图列表

Max*_*rra 2 backbone.js underscore.js

让我先展示我需要什么,以便您了解我的问题。我有一个联系人视图,如:

ContactView = Backbone.View.extend({
    template: _.template("Name: <%= name %>
                          E-mail: <%= email %>
                          Phones
                          <%= label1 %> - <%= number1 %>
                          <%= label2 %> - <%= number2 %>"),
    render: function() {
       var contact = this.template(this.model.toJSON());
       this.$el.html(contact);
    }
});
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,问题是电话部分是一个列表,我的模型包含一个电话数组,我需要将它动态地放入该模板中。

我的想法是创建另一个模型并为此查看 Phone 和 PhoneView。然后在 ContactView 中,我将创建一个方法 render_phones,例如:

render_phones: function() {
    var phones = this.model.get('phones');
    var phones_str = "";
    for (var i in phones) {
        var phone = new Phone(phones[i]);
        var phoneView = new PhoneView({model: phone});
        phones_str += phoneView.render();
    }
    return phones_str;
}
Run Code Online (Sandbox Code Playgroud)

我将 ContactView 模板更改为:

template: _.template("Name: <%= name %>
                      E-mail: <%= email %>
                      Phones
                      <%= phones %>"),
Run Code Online (Sandbox Code Playgroud)

但是如何让我的渲染方法得到电话列表渲染并放入模板中?

我找不到处理这种情况的模式。代码开始看起来不太好。

ps:这只是一个例子,我的应用程序还有其他几个部分需要这个,一个需要生成包含列表内容的子视图的视图。

Jac*_*ack 5

看起来您正在使用 underscore.js 来呈现模板,underscore.js 提供了一种在模板中呈现集合的方法(请看第二个示例)。例如

template: _.template("Name: <%= name %>
                          E-mail: <%= email %>
                          Phones
                <% _.each(phones, function (phone) { %>
                 <%= label %> - <%= number %>
                <% }); %>"),
Run Code Online (Sandbox Code Playgroud)

您还可以为每个模型渲染一个单独的视图,并在同一个渲染模型中修改el以在那里渲染它,但除非您需要该视图(例如内容会改变或您正在收听事件),否则它可能不会支付这样做。这是您如何实现这一目标的示例

render: function () {
  this.$el.html(this.model.toJSON());
  _.each(this.model.get('phones'), function(phone) {
    this.$el.find('.phoneArea').append(new phoneView({model: phone}).render().el));
  },this);
  return this;
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您要走这条路线,那么请注意,缓存视图可能需要付费,但同样,如果您只需要呈现内容,那么只需将电话号码保留为数组并将其呈现在模板。