【问题标题】:why can't I get two instances of my view to render?为什么我不能渲染我的视图的两个实例?
【发布时间】:2013-03-31 05:55:28
【问题描述】:

就此而言,我是backbone.js 和JavaScript 的菜鸟......我正在尝试使用Jquery 和backbone.js 构建一个简单的小部件系统,但我似乎无法弄清楚如何获得我要渲染的视图的多个实例。但是,我能够获得一个实例来呈现......我的最终目标是构建一个系统,我可以在其中单击一个按钮并让它每次都在屏幕上呈现一个新的小部件。 这是我的代码:

    <script type="text/template" id="widget-template">
    <div class="widget-wrap">
        <div class="widget-header">
            <span class="widget-title"><%= widgetInfo.get('title') %></span>
            <span class="widget-close"></span>
            <span class="widget-hide"></span>
            <span class="widget-expand"></span>
        </div>
        <div class="widget-container">
            <!-- this is where the widget content goes --> 

        </div>
</div>
    </script>


    <script typ="text/javascript">

        var baseWidget = Backbone.Model.extend({
            defaults: {
                title: "Base",
                author: "AB",
                multipleInstances: false,
                description: "This is the base widget",
                pathToIcon: "",
                state: "Open",
                position: {left:0, top:0}
                }

        });




    var widgetCollection = Backbone.Collection.extend({
        model: baseWidget

    });

    var widgetcol = new widgetCollection();  

        var baseView = Backbone.View.extend({
            el: '.wraper',
            render: function(pos = {left:0, top:0}) {
                var widget = new baseWidget();
                widgetcol.add(widget); 
                console.log(widgetcol.length); 
                widget.set({'position':pos})




                var template = _.template($('#widget-template').html(), {widgetInfo: widget});
                this.$el.html(template);
                this.$el.offset({top:widget.get('position').top, left:widget.get('position').left})
                $('.widget-wrap').draggable({ 
                    handle: ".widget-header",
                    stop: function (event, ui) {
                        widget.set({position: ui.position});
                        console.log(widget.get('position')); 
                    }

                }); 

            }
        });



        BV = new baseView(); 
        BV.render({left:0, top:0}); 


        b = new baseView();
        b.render({left:500, top:0});

任何帮助都将不胜感激,如果我正在做任何非常奇怪的事情,我会喜欢关于如何做得更好的建议。

【问题讨论】:

  • 也要注意defaults 中的position: { ... },默认值是浅复制的,因此您最终可能会得到两个baseWidgets 共享完全相同的position 对象。如果默认值中有任何可变值,您应该使用defaults 的函数。

标签: javascript jquery templates backbone.js


【解决方案1】:

当您在视图中设置el 属性时,您会将视图绑定到 dom 中的现有元素,从而限制您自己只能创建一个小部件。您真正想要做的是让视图生成元素标记并将所有生成的小部件附加到某个父级。 您可以通过在视图中设置tagNameclassNameid 属性来做到这一点。

例如:

var baseView = Backbone.View.extend({
  tagName: 'div',
  className: '.wrapper'
  ...
});

这将生成一个带有 wrapper 类的 div,您可以将其附加到容器中。

稍后,您定义一个点击事件来每次创建一个新的小部件:

$('button').click(function() {
  var newView = new baseView();
  newView.render();
  $('.container').append(newView.el); // now 'el' correspond to the div.wrapper you just created
});

在主干开发人员中,从视图的渲染方法返回this 被认为是一种很好的做法。这样你就可以像这样混合最后两行:

$('.container').append(newView.render().el);

另外,如果在定义视图之前实例化集合,人们倾向于将集合作为构造函数参数的属性传递:

var collection = new widgetCollection();
BV = new baseView({ collection: collection }); 

现在您可以通过简单的this.collection 引用视图内的集合。

【讨论】:

猜你喜欢
  • 2017-10-15
  • 2020-10-11
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
相关资源
最近更新 更多