Backbone.js Collection.add方法被第三方脚本覆盖

时间:2015-02-10 00:13:15

标签: javascript backbone.js internet-explorer-8 requirejs underscore.js

我遇到的问题是在正在使用Require注入的依赖项上覆盖了一个方法。

目前我有一个实用程序可以添加和控制我们网站上的一些通知,您可以在下面看到。

define([
    'jQuery',
    'Underscore',
    'Backbone',
    'Data',
    'Window',
    'text!utilities/notify/templates/utility.html'
], function($, _, Backbone, Data, Window, Template) {
    var Notify = Backbone.View.extend({

        events: {
            'click': 'close'
        },

        initialize: function() {
            var self = this;

            _.bindAll(this);

            // add notify if not in the dom
            var element = $('#notify')[0];
            if(_.isEmpty(element)) {
                var template = _.template(Template, {});
                $('body').prepend(template);
            }

            Data.add([
                // notify object
                {
                    id: 'notify',
                    addToUrl: false,
                    addToHistory: false
                }
            ]);
        }
    return new Notify;

});

(这只是该文件的一小部分及相关数据)

Data依赖项是一个包装器,用于添加一些辅助方法来处理集合。但是我们不会以任何方式重载或修改Collection上的add方法。我面临的问题是,在每个现代常绿浏览器(chrome,firefox等)中,数据被正确注入,Data.add()按预期工作。但是在IE8中(遗憾的是我必须支持),Data.add方法在我们页面上使用的Googles Adsense async-ads.js文件中执行了一个函数。当发生这种情况时,它会导致疯狂的递归,IE8会发出stack overflow消息。

我对第三方JS函数如何覆盖Data.add()方法感到非常困惑!任何想法都会受到很大关注!

包含的JS版本信息

Backbone 1.0.0
Require 2.1.2
Underscore 1.3.3

编辑:我已按要求包含数据实用程序中的代码

/**
@appular {utility} data - designed to store variables for apps that multiple modules may need access too. works closely with the router to keep the url updated as well.
    @extends backbone.collection
    @define Data
*/
define([
    'jQuery',
    'Underscore',
    'Backbone',
    'utilities/data/models/data',
    'Cookies'
], function($, _, Backbone, DataModel, Cookies){
    var Collection = Backbone.Collection.extend({

        model: DataModel,

        lastChanged: '',

        initialize: function() {
            _.bindAll(this);


            this.on('add', function(model) {
                model.on('change', function() {
                    this.lastChanged = model.get('id');
                    this.trigger('dataChanged', model.get('id'));
                }, this);
            }, this);
        },

        // Sets data based on url data on initial load (ignores any parameters that are not defined in initialize above)
        load: function(data) {
            var dataInitialized = _.after(data.length, this.finalizeLoad);
            _.each(data, function(dataArray) {
                var model = this.get(dataArray[0]);

                if(!model) {
                    model = _.find(this.models, function(model) { return model.get('alias').toLowerCase() === dataArray[0].toLowerCase(); });
                }

                if(model) {
                    model.set({value: decodeURIComponent(dataArray[1])}, {silent: true});
                }

                dataInitialized();
            }, this);
        },

        finalizeLoad: function() {
            var triggerInitialized = _.after(this.length, this.triggerInitialized);

            _.each(this.models, function(model) {
                if(model.get('getFromCookie')) {
                    var cookieName = null;

                    if(model.get('alias') !== '') {
                        cookieName = model.get('alias');
                    } else {
                        cookieName = model.get('id');
                    }

                    model.set({value: Cookies.get(cookieName)});
                }

                if(model.get('isArray') && _.isString(model.get('value'))) {
                    var value = model.get('value');
                    model.set('value', value.split(','));
                }

                triggerInitialized();
            }, this);
        },

        /**
        @doc {event} initialized - fires when all data has been loaded
        */
        triggerInitialized: function() {
            this.trigger('initialized');
        },

        /**
        @doc {function} getValueOf - shortcut to get model's value
        */
        getValueOf: function(name) {
            return this.get(name).get('value');
        },

        /**
        @doc {function} setValueOf - shortcut to set model's value
        */
        setValueOf: function(name, value) {
            return this.get(name).set('value', value);
        }

    });

    return new Collection;
});

0 个答案:

没有答案