【问题标题】:Underscore Template not working with Backbone View下划线模板不适用于主干视图
【发布时间】:2014-03-11 20:48:20
【问题描述】:

我不确定为什么我的下划线模板没有呈现。我希望它根据返回的数据显示 3 个select 下拉菜单。

这是我的代码的一个小提琴。检查控制台的数据:http://jsfiddle.net/f7v3g/

如果您看到返回的数据,您将看到以下结构

-模型

--属性

---尺寸

----object0

-----name(将是出现在first下拉菜单旁边的文本标签)

-----refinements(refinements 的子元素应该是option 标签)

----对象1

-----name(将是出现在 second 下拉菜单旁边的文本标签)

-----refinements(refinements 的子元素应该是option 标签)

----object2

-----name(将是出现在第三个下拉菜单旁边的文本标签)

-----refinements(refinements 的子元素应该是option 标签)

这是主干 JavaScript:

(function () {

    var DimensionsModel = Backbone.Model.extend({

        defaults: {
            dimensionName : 'undefined',
            refinements : 'undefined'
        }

    });

    var DimensionsCollection = Backbone.Collection.extend({
        model: DimensionsModel,

        url: 'http://jsonstub.com/calltestdata',

    });

    var setHeader = function (xhr) {
        xhr.setRequestHeader('JsonStub-User-Key', '0bb5822a-58f7-41cc-b8a7-17b4a30cd9d7');
        xhr.setRequestHeader('JsonStub-Project-Key', '9e508c89-b7ac-400d-b414-b7d0dd35a42a');
    };

    var DimensionsView = Backbone.View.extend({
        el: '.js-container',

        initialize: function (options) {
            this.listenTo(this.model,'change', this.render);

            this.model.fetch({
                beforeSend: setHeader
            });

            console.log(this.model);

            return this;
        },

        render: function () {
            this.$el.html( this.template(this.model, 'dimensions-template') );
        },

        template: function (models, target) {
            var templateSelectors = _.template($('#'+target).html(),{
                dimensions: this.model
            });

            return templateSelectors;
        },

    });

    var myCollection = new DimensionsCollection();
    var myView = new DimensionsView({model: myCollection});

}());

这是我的 HTML 和下划线模板:

<div class="js-container">

    <script type="text/template" id="dimensions-template">
        <% _.each(dimensions, function(dimension,i){ %>

            <%- dimension.get('dimensionName') %> <select id="<%- dimension.get('dimensionName') %>">
                <option>Select</option>
                <%  _.each(dimension.get('refinements'), function(ref,x){ %>
                    <option data-refineurl='{
                        "refinementUrl": "<%- ref.refinementurl %>",
                        "nVal": "<%- ref.nval %>"
                    }'><%- ref.name %></option>
                <% }); %>
            </select>

        <% }); %>
    </script>

</div>

编辑:数据结构的拼写和示例。

【问题讨论】:

    标签: javascript backbone.js underscore.js underscore.js-templating


    【解决方案1】:

    我看到几个错误:

    1) 在 DimensionsView 初始化中,你应该添加一个 this.render 调用

    2) 内模板:函数(models, target),你使用this.models。但是您将模型作为第一个参数传递?

    3) 您是否在某个地方将模型添加到您的收藏中?现在您的模板将尝试遍历它们。所以它需要模型在集合中循环。

    【讨论】:

    • 我更新了 JS 代码并在这里分叉了小提琴:jsfiddle.net/KT2B2 我添加了一个渲染调用,就像你提到的那样。我还删除了模板方法并在渲染方法中设置它。我认为该模型已经添加到DimensionsCollection 部分中model: DimensionsModel 的集合中。然后,当我实例化视图的新版本时,我将其传递给视图。这是不正确的吗?谢谢!
    • 你把它传递给视图,很好。但是您永远不会将模型添加到模型集合中
    • 我想我在这一点上迷路了。我已经用一些 cmets 再次更新了小提琴,关于我认为我将模型添加到集合中的位置,然后将信息传递给视图。 jsfiddle.net/KT2B2
    • 我的意思是在调用渲染时,获取还没有完成。你能尝试在你的 fetch 调用中添加 asyncLfalse 吗
    • 我在小提琴中添加了async: false。提取现在看起来像 dimensionCollection1.fetch({beforeSend: setHeader, async: false}); 感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多