【问题标题】:Backbone Marionette / ItemView tag骨干木偶 / ItemView 标签
【发布时间】:2013-08-12 16:13:16
【问题描述】:

我想基于使用 Marionette 的 ItemView 的集合来呈现带有 <option><select>。因为选项需要具有实际的“值”才能使我的应用程序正常工作,所以我有点不确定如何让 Marionette 处理这个问题?如果我在我的 ItemView 中设置 tagName: 'option',我不确定如何在渲染后添加选项。我以为我可以让<option value="<%= id %>"> 在模板中,但这会导致双<option> 元素呈现,因为我已经在我的ItemView 的tagName 属性中指定了它。这样做的最佳做法是什么?我的模板如下所示:

<script type="text/template" id="sport-item-view">
    <option value="<%= id %>"><%= name %></option>
</script>

【问题讨论】:

    标签: backbone.js marionette


    【解决方案1】:

    您是否使用 CollectionView 作为父视图类型来将模型集合呈现到 select 中?如果你是,你不应该是。

    由于option 项目需要属性中的所有内容,因此您已经遇到过为每个选项渲染模板变得很痛苦的情况。相反,对整个 select 框使用单个 ItemView。 ItemView 可以将集合放入其中,您可以通过模板内的items 访问该集合。这使得使用单个视图从集合中创建选择框变得非常简单:

    <script type="text/html" id="select-template">
      <% _.each(items, function(item){ %>
        <option value="<%= item.id %>"><%= item.get("someValue") %></option>
      <% }) %>
    </script>
    
    
    var SelectView = Marionette.ItemView.extend({
      tagName: "select"
    });
    
    var s = new SelectView({
      collection: myData
    });
    
    s.render();
    

    这样做的缺点是您的选择框只有 1 个视图,这意味着您必须从选择框中读取选定的值才能确定您正在处理的模型。但这只是几行代码,否则它会省去很多麻烦。

    【讨论】:

    • 谢谢德里克!这是一个优雅的解决方案。我现在让它工作了,但它没有触发任何事件(事件就像“点击#select”:'foo'然后是foo的函数:function(){console.log('bar')})不会'注册。有什么想法吗?代码在这里:gist.github.com/StevenLangbroek/6214494
    • 由于views标签是选择框,所以不需要为事件指定元素。只需为事件配置执行"click": "somemethod"
    【解决方案2】:

    您可以简单地使用attributes

    你可以这样重写构造函数:

    constructor : function (options) {
      this.attributes = {
        value : options.model.id
      };
      ItemView.prototype.constructor.apply(this, arguments);
    }
    

    你的模板会是这样的:

    <%= name %>
    

    http://jsfiddle.net/vpetrychuk/6Bk9T/

    【讨论】:

    • 如何获取当前模型的ID?我试过this.model.get('id'),但这显然是错误的......
    • 这在我的上下文中没有多大意义:gist.github.com/StevenLangbroek/6212670
    • 请原谅我的无知,但是创建和维护 2 个视图对象 + 1 个模板只是为了呈现一个选择真的有意义吗?
    • 是的,我可能不应该尝试在 Marionette 中硬塞一切,这也是从另一个答案中得到的。对于一些琐碎的事情来说,这是很多代码......
    【解决方案3】:

    也许在更传统的意义上处理这种类型的视图更好,只需在渲染之后添加选项,或者在触发事件上添加选项。以下是我根据获取的数据动态添加选项的方法:

            var mySelect = this.ui.mySelect; // a reference to select from ui hash
            mySelect.html('');  //clear
    
            //for each data item add an option
            _.each(items, function (item) { 
                mySelect .append($('<option/>', {
                    value: item.id,
                    text: item.description
                }));
            });
    

    【讨论】:

    • 感谢您的回复。由于这是一个更大的应用程序的一部分,并且选择最终会驱动 UI 的另一部分,所以我更愿意将其保留在 Backbone / Backbone.Marionette...
    • 我不认为你理解我。这是更大视图的功能之一。您当然可以在选择更改时添加事件侦听器,或者您需要驱动进一步的 UI 渲染。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多