javascript - Backbone.js 模型缓存

标签 javascript backbone.js

注意:我是 Backbone 平台的新手! :)

我的主干中有这个模型:

var errors_model    =   Backbone.Model.extend(
{
        total_errors     : 0,
        error_messages   : {},
        initialize       : function ()
        {
            this.set('total_errors',        0);
            this.set('error_messages',      {});
        },
        add_error        : function (tab, field, error)
        {
            var error_messages = this.get('error_messages');
            var error_md5 = this.md5(error);

            if(!(tab in error_messages))
            {
                error_messages[tab] =   {};
            }

            if(!(field in error_messages[tab]))
            {
                error_messages[tab][field]  =   {};
            }

            if(!(error_md5 in error_messages[tab][field]))
            {
                error_messages[tab][field][error_md5]   =   error;
            }

            this.set('error_messages', error_messages);
            this.increase_errors();
            console.log(error_messages);
        },
        remove_error     : function (tab, field, error)
        {
            var error_messages  =   this.get('error_messages');
            var error_md5       =   this.md5(error);

            if(!(tab in error_messages) && !(field in error_messages[tab]) && !(error_md5 in error_messages[tab][field]))
            {
                return;
            }

            delete error_messages[tab][field][error_md5];

            this.set('error_messages',  error_messages);
            this.decrease_errors();
            console.log(error_messages);
        },
        increase_errors  : function()
        {
            var total_errors    =   this.get('total_errors');

            if('undefined' === typeof(total_errors))
            {
                total_errors    =   0;
            }

            ++total_errors;

            this.set('total_errors',    total_errors);
        },
        decrease_errors  : function()
        {
            var total_errors    =   this.get('total_errors');

            if('undefined' === typeof(total_errors))
            {
                total_errors    =   0;
            }

            if(0 === total_errors)
            {
                return;
            }

            --total_errors;

            this.set('total_errors',    total_errors);
        }
    }
);

com                        =   window.com  ||  {};
com.wp                     =   com.wp      ||  {};
com.wp.srb                 =   com.wp.srb  ||  {};
com.wp.srb.errors_model    =   new errors_model();

然后我使用这段代码:

com.wp.srb.errors_model.add_error('#ad',       '#image_upload',    'This is an error');
com.wp.srb.errors_model.add_error('#ad',       '#image_upload',    'Another error');
com.wp.srb.errors_model.add_error('#ad',       '#image_upload',    'Yet another error');
com.wp.srb.errors_model.add_error('#ad',       '#image_url',       'URL error');

setTimeout(
    function()
    {
        com.wp.srb.errors_model.remove_error('#ad',    '#image_upload',    'Another error');
    },
    3500
);

但我得到的结果是这两个操作(com.wp.srb.errors_model.add_errorcom.wp.srb.errors_model.remove_error):

Object {#ad: Object}
    #ad: Object
        #image_upload: Object
            13b7afb8b11644e17569bd2efb571b10: "This is an error"
            69553926a7783c27f7c18eff55cbd429: "Yet another error"
        #image_url: Object
            2b4a9847e26368312704b8849de9247a: "URL error"
            __proto__: Object
        __proto__: Object
    __proto__: Object

Object {#ad: Object}
    #ad: Object
        #image_upload: Object
            13b7afb8b11644e17569bd2efb571b10: "This is an error"
            69553926a7783c27f7c18eff55cbd429: "Yet another error"
        #image_url: Object
            2b4a9847e26368312704b8849de9247a: "URL error"
            __proto__: Object
        __proto__: Object
    __proto__: Object

Object {#ad: Object}
    #ad: Object
        #image_upload: Object
            13b7afb8b11644e17569bd2efb571b10: "This is an error"
            69553926a7783c27f7c18eff55cbd429: "Yet another error"
        #image_url: Object
            2b4a9847e26368312704b8849de9247a: "URL error"
            __proto__: Object
        __proto__: Object
    __proto__: Object

Object {#ad: Object}
    #ad: Object
        #image_upload: Object
            13b7afb8b11644e17569bd2efb571b10: "This is an error"
            69553926a7783c27f7c18eff55cbd429: "Yet another error"
        #image_url: Object
            2b4a9847e26368312704b8849de9247a: "URL error"
            __proto__: Object
        __proto__: Object
    __proto__: Object

Object {#ad: Object}
    #ad: Object
        #image_upload: Object
            13b7afb8b11644e17569bd2efb571b10: "This is an error"
            69553926a7783c27f7c18eff55cbd429: "Yet another error"
        #image_url: Object
            2b4a9847e26368312704b8849de9247a: "URL error"
            __proto__: Object
        __proto__: Object
    __proto__: Object

所以问题是,Backbone 模型是否以某种方式缓存对象属性?我做错了什么吗?

注意:这是将在 WordPress Dashboard 中使用的插件的一部分,我不知道 WordPress 是否已经使用任何插件来缓存模型数据。

最佳答案

控制台保存对对象的引用,因此当您在代码执行后检查它们时,对象的状态将是现在的状态,而不是调用时的状态:

console.log(error_messages);

这可能适用于字符串或数字,但不适用于对象。值得庆幸的是,您可以使用以下方法将对象转换为字符串:

JSON.stringify(error_messages);

这将为您提供执行时对象的快照。

关于javascript - Backbone.js 模型缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26254205/

相关文章:

javascript - backbone.js:将属性设置为现有值时触发的模型事件?

javascript - 在数组中分组、过滤和计数

javascript - 如何获取 svg :g element 的宽度

backbone.js - 将 Backbone.Marionette 布局附加到 "body"

javascript - 如何使用 AngularJS/Ionic 作为 Backbone/Cordova 项目的一部分?

javascript - 将以下代码从 for 循环转换为 Array#map

javascript - 为什么 Node.js htmlparser2 在解析文档时插入额外的 Node ?

javascript - 如何生成带有嵌套元素的按钮标签

javascript - jQuery .append() 函数错误

javascript - 我应该如何使用主干 View 呈现集合的特定值