Javascript Backbone.js Collection.add方法被第三方脚本覆盖
我遇到了一个问题,即在注入Require的依赖项上覆盖了一个方法 目前,我有一个实用程序,可以在我们的网站上添加和控制一些通知,您可以在下面看到Javascript Backbone.js Collection.add方法被第三方脚本覆盖,javascript,backbone.js,internet-explorer-8,requirejs,underscore.js,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, T
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;
});
这只是该文件中包含相关数据的一小部分
数据依赖项是一个包装器,用于添加一些帮助器方法来处理集合。但无论如何,我们都不会重载或修改集合上的add方法。我面临的问题是,在每一款现代evergreen浏览器chrome、firefox等中,数据都被正确注入,Data.add也能正常工作。但不幸的是,在IE8中,我不得不支持Data.add方法突然执行我们在页面上使用的Google Adsense async-ads.js文件中的一个函数。当这种情况发生时,它会导致疯狂的递归,IE8会给出堆栈溢出消息
我完全搞不懂Data.add方法是如何被第三方JS函数覆盖的!任何想法都将受到极大的赞赏
包括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;
});
所显示的代码对于典型的主干视图来说有点超出范围,但是没有任何东西看起来会破坏对数据的调用。。。。你能为数据包装器提供代码吗?Peter Wagner我已经更新了原始问题