【问题标题】:Can't insert content after specific division. Backbone.js特定分割后不能插入内容。骨干网.js
【发布时间】:2025-12-14 12:30:01
【问题描述】:

这是我得到的:

ProductListView.js

define(['jquery', 'underscore', 'backbone', 'views/ProductView', 'views/PaginatorView'], function($, _, Backbone, ProductView, PaginatorView) {
    var ProductListView = Backbone.View.extend({
        className: 'productsList',
        initialize: function() {
            this.render();
        },
        render: function() {
            // some initialization
            // that's for zurb grid                
            this.$el.addClass('twelve columns');

            for(var i = startPos; i < endPos; i++) {
                this.$el.append(new ProductView({ model: products[i] }).render().el);
            }

            this.$el.append(new PaginatorView({ model: this.model, page: this.options.page }).render().el);
            // this.$el.after(new PaginatorView({ model: this.model, page: this.options.page }).render().el);
            return this;
        }
    });
    return ProductListView;
});

this.$el 后面好像不能插入东西。线

this.$el.after(new PaginatorView({ model: this.model, page: this.options.page }).render().el);

虽然可以在 (ProductListView) 视图中附加 PaginatorView,但似乎无法在其外部插入一些东西。

你遇到过这样的事情吗?

【问题讨论】:

    标签: javascript jquery dom backbone.js


    【解决方案1】:

    this.$el.after 会失败,因为在调用render() 时,this.$el 尚未插入 DOM(它只是一个悬空的 div)。

    Backbone 鼓励您等到视图的 HTML 内容准备好后再插入。这样,浏览器只重绘一次窗口,性能更好。

    根据经验,您应该只在 Backbone 视图中操作位于 this.$el 内的内容。

    【讨论】:

    • 好的,我会试着把它移到路由器上!我怀疑它已与 DOM 分离。谢谢!
    【解决方案2】:

    如果视图元素尚未添加到 DOM(“断开连接”),则在其上调用 after() 不会更改元素或 DOM。但是,它确实返回了一个包含两个元素的集合,您可以将它们分配给 this.$el 以便稍后附加它们。但我很确定这不是一个好的做法,因为 View 只与一个元素纠缠在一起。

    【讨论】:

    • 这可能会导致一些问题,因为el$el 将不再匹配,setElement 也期望一件事。你最终会得到绑定到不完全$el 的东西的委托。可能会起作用,但它闻起来很糟糕,并且可能会在您最意想不到的时候以新颖有趣的方式打破。
    • 是的,这就是我说“糟糕的做法”的原因。 以有趣的方式打破 :-)