Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将backbone.sync与jstorage集成?_Javascript_Backbone.js - Fatal编程技术网

Javascript 如何将backbone.sync与jstorage集成?

Javascript 如何将backbone.sync与jstorage集成?,javascript,backbone.js,Javascript,Backbone.js,我是一名javascript新手(第一篇文章在这里!),最近一直在尝试使用backbone.sync。我已经通读了这个示例,并注意到它使用了。我的感觉是,主干本地存储只是作者用于演示目的的一个快速实现。我还注意到这些键是随机生成的,而我希望能够命名自己的键值 我一直在关注jstorage(www.jstorage.info),非常希望能提供一些关于如何将其与backbone.js集成的建议(最好是带有代码示例)。我想主干网.sync需要像主干网本地存储那样被覆盖 或者,您会推荐什么本地存储插件/

我是一名javascript新手(第一篇文章在这里!),最近一直在尝试使用backbone.sync。我已经通读了这个示例,并注意到它使用了。我的感觉是,主干本地存储只是作者用于演示目的的一个快速实现。我还注意到这些键是随机生成的,而我希望能够命名自己的键值

我一直在关注jstorage(www.jstorage.info),非常希望能提供一些关于如何将其与backbone.js集成的建议(最好是带有代码示例)。我想主干网.sync需要像主干网本地存储那样被覆盖

或者,您会推荐什么本地存储插件/包装器,以及它将如何与主干网集成


提前感谢您的帮助。

您可能应该先看看backbone.js提供的本地存储插件。有很多代码示例可以让您了解如何将jstorage交换为底层存储机制。请看这里:

我的感觉是,主干本地存储只是作者用于演示目的的一个快速实现

完全正确。我要说的是,实现在大多数情况下都很好,但是您可以从中获得的支持可能很少

我还注意到这些键是随机生成的,而我希望能够命名自己的键值

这不是真的正确。我想你指的是:

// Add a model, giving it a (hopefully)-unique GUID, if it doesn't already
// have an id of it's own.
create: function(model) {
    if (!model.id) model.id = model.attributes.id = guid();
    this.data[model.id] = model;
   this.save();
   return model;
}
这里发生的事情是,当在模型上调用create时,它尝试确定是否在模型上设置了
id
,如果没有提供这样的
id
,则使用
guid
函数构建一个。这并不是随机设置一个键,而是满足了每个保存的模型都应该有一个id的要求(通过分配一个随机的id)

修改主干localstorage.js代码应该相当简单。让我们以存储构造函数为例

Before:
var Store = function(name) {
    this.name = name;
    var store = localStorage.getItem(this.name);
    this.data = (store && JSON.parse(store)) || {};
};
我们需要在此处更新的唯一内容是对localStorage的调用:

After:
var Store = function(name) {
    this.name = name;
    //Notice here, that jStorage gives us the option to define a default.
    var store = $.jStorage.get(this.name, {}); 
    this.data = store;
};
After:
save: function() {
    $.jStorage.set(this.name, this.data);
}
保存功能同样简单:

Before:
save: function() {
    localStorage.setItem(this.name, JSON.stringify(this.data));
}
同样,只需更新对localStorage的调用:

After:
var Store = function(name) {
    this.name = name;
    //Notice here, that jStorage gives us the option to define a default.
    var store = $.jStorage.get(this.name, {}); 
    this.data = store;
};
After:
save: function() {
    $.jStorage.set(this.name, this.data);
}
更新:jStorage为您处理所有的JSON.stringify和JSON.parse,因此我更新了上述代码以反映这一点

轻松点,对吧

无论如何,这是一个很好的练习,我祝你好运。我希望我能帮助你

另外,localStorage插件有一件事让我感到困扰,那就是它使用了
model.attributes.xxx
,最好使用
model.get(“xxx”)
。这样,如果他们更改了模型更改的内部内容,您的代码就不会中断


p.p.s.至于如何生成guid,以及随机guid是否适合您,取决于您的域。在TODO示例中,没有可与之同步的备份数据库,因此任何旧guid都可以做到这一点,但在许多其他情况下,您可能使用html5存储创建应用程序的脱机版本,因此id需要与db兼容。在这些情况下,使用随机guid可能不是一个好主意,但是主干localstorage插件提供的guid的设计不太可能与数据库的实际id发生冲突,因此也没那么糟糕。这里没有真正正确的答案,所以请做对您的域有意义的事情。

是的,我看了那个例子,发现backbone.sync需要以某种方式重写。是否有一个标准的jstorage适配器,或者以前有没有人解决过这个问题并能提供代码?我没有看到任何现成的实现。但似乎很容易接受他们对插件所做的工作,并开始在API方法中的jstorage调用中进行交换。基本上,在您看到他们访问其数据属性的任何地方,都需要使用等效的jstorage调用。有意义吗?投票给你是因为你费心写了一些代码,而我不喜欢。:)此外,有时我编写的方法甚至会隐藏model.get('xxx'),因为这甚至意味着对内部的知识太多。如果模型改变了它的底层属性,基本上你也会遇到同样的问题。它们改变
.get
的可能性似乎要小得多,而且你可能会很容易地走得太远。使用
.get
似乎是合适的级别。我想我同意不同意你的观点。model.attributes.xxx和model.get('xxx')之间实际上没有区别。在这两种情况下,调用者对底层实现知道的太多。也就是说,在这种情况下,它可能是无害的。@idbentley非常感谢您的代码。我在这一行“this.data=(store&&JSON.parse(store));”上得到一个错误SyntaxError:意外标记非法。有什么想法吗?另外,我注意到我们没有像我之前认为的那样覆盖Backbone.sync,而是修改了您提到的两个函数。这是否意味着jstorage需要backbone-localstorage.js本身?我以前认为这样做的方法是在jstorage.js中添加一个Backbone.sync方法。另外,对于GUID生成,是否标准做法是在Backbone localstorage中实现它?(即,4个随机十六进制数字)。为什么不是增量值?非常感谢@Bill和@idbentley的耐心和回答我的问题。