1

我对其中的comparator功能感到满意Backbone.Collection,我也对排序集合然后从视图中重绘整个事物的想法感到满意。但是,我不是在这里寻找那个。

我有一个已排序的集合(加载时)。一个视图监听集合并负责在“重置”时迭代它。该系列的模型有自己的看法。这里没有什么不寻常的。

但是,用户可以在线编辑每个模型,可能会更改比较器功能中的属性值。显然,一种解决方案是清除整个集合的视图,重新排序集合,然后重绘所有模型的视图。但如果可能的话,我想避免这样做。

理想情况下,我应该能够从集合视图中删除更改后的模型,然后将其重新插入到集合视图中新的、适当的位置(所以我只做一个 DOM 删除和一个 DOM 添加 - 而不是清除然后重新绘制整个模型集合)。我当然可以手动执行此操作,而无需骨干网的任何帮助,但我想我会问是否有骨干网的任何功能可以使其更容易,或者至少更精简。完全在主干之外执行此操作似乎是一种 hack,而且看起来并不漂亮。

4

1 回答 1

1

我想我知道你在说什么。假设您可以访问相关模型和视图,这是一种基本方法:

// assumption: this is called on "change" event, only once
re_insert_item : function(model,m_view,collection,c_view) {

    // remove the model's view from the DOM
    m_view.$el.remove();

    // assuming there is a comparator, sort() will move the
    // model into the correct position of the collection. since
    // we're not doing a .remove and .add, we have to sort manually
    // (as per documentation instructions)
    collection.sort();

    // figure out the model that, based upon its sort position, our
    // edited model will come *before*
    var idx = collection.indexOf(model);
    var next_model = collection.at(idx+1);

    // insert our model's view into the DOM right above it's neighbour
    // this assumes you have some way to get a view for a given model,
    // which there isn't really a "standard" way to do (it seems)
    if ( next_model ) {
        var next_m_view = ??? // assume you have some way to get this
        next_m_view.$el.before(m_view.render().$el);
    }

    // this model is last in the list, so just append it to the
    // collection view (assuming the collection view houses the
    // master list as its $el)
    else {
        c_view.$el.append(m_view.render().$el);
    }
}

您必须根据以下条件更改其中的一部分: a) 您计划将代码放在哪里 - 即,您将从哪里/如何获取函数参数;b) 你如何将模型和视图链接在一起。

SO上有一个(有点)类似的问题。但是,与我在上面的链接中突出显示的答案相反,如果可以避免,我宁愿不使用 DOM 遍历代码,而是依赖骨干集合的顺序。

不过,我认为这就是您要寻找的。如果没有,请尽可能具体地说明缺少的内容。

于 2013-10-14T05:17:14.780 回答