【问题标题】:How could I change the data order in localStorage in Backbone.js app?如何更改 Backbone.js 应用程序中 localStorage 中的数据顺序?
【发布时间】:2012-05-10 16:01:18
【问题描述】:

我现在正在制作一个 Backbone 应用程序,并使用一个 backbone.localstorage 插件来保存数据。我的应用程序有一些可排序的项目,所以我希望每次对项目进行排序时,localStorage 中的数据顺序也会发生变化。并且下次我刷新整个页面时,页面将由排序后的数据呈现。但似乎主干.localstorage 将按其创建顺序保存数据。有人可以给我一些想法吗?

【问题讨论】:

    标签: backbone.js local-storage


    【解决方案1】:

    如果您希望您的模型以明确的顺序出现,请在您的集合中包含一个comparator,并可能在每个模型中包含一个位置编号。

    Local storage is:

    一种可以安全地存储字符串键/值对并在以后检索以供使用的方法。

    注意键/值对,这意味着您正在处理或多或少的大哈希表,而这些哈希表通常是无序的。此外,来自fine specification

    键的顺序是用户代理定义的,但必须在对象内保持一致,只要键的数量不变。 (因此,添加或删除键可能会更改键的顺序,但不能仅更改现有键的值。)

    因此本地存储内部没有特定的顺序。如果你想要一个特定的订单,你必须自己安排。

    在您的情况下,您的模型中可能有一个 positionindex 属性,其行为类似于数组索引;然后,在您的收藏中:

    comparator: function(m) { return m.get('position') } // or 'index'
    

    您还可以使用两个参数 comparator 函数:

    comparator: function(a, b) {
        a = a.get('position');
        b = b.get('position');
        if(a < b)
            return -1;
        else if(a > b)
            return 1;
        return 0;
    }
    

    您必须在移动模型时维护位置索引,但这应该不是很困难。您还可以在将数据从本地存储中拉出之后但在将其放入您的集合之前通过position 对数据进行排序,然后在将模型写入本地存储时分配position 值。

    【讨论】:

    • 因此,如果我为每个模型分配一个索引并在集合中包含一个比较器,那么每次我使用this.collection.fetch() 加载数据并渲染视图时,它将自动以有序的方式显示对吧?
    • @chaonextdoor:如果您包含比较器,那么每次您在集合上调用add 时,都会使用该比较器对集合进行排序(除非您将at 选项指定为add)。这可能会使手动重新排序变得有点棘手,因此您可能只想担心从本地存储出来和进入本地存储的位置。
    • 所以如果我调用this.collection.add(),模型将被插入到正确的位置。但是如果我一开始就调用this.collection.fetch()来渲染初始页面,整个页面仍然是无序的,我必须先手动对其进行排序,然后再渲染初始视图,对吧?
    • add 将把它放在正确的位置,如果你有一个 comparator 并且模型有正确的 position 属性,同样适用于 fetch
    • 还有一个问题,我尝试使用localStorage.data,它会显示所有数据。但是我怎样才能访问 localStorage 中的特定数据项呢?似乎 localStorage 数据总是有一个随机键,例如714b097d-875e-7f18-b004-665676d98974。我如何在不参考这些烦人的随机键的情况下访问与此键关联的值?
    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多