Javascript 突然,我的BackboneJS系列不再';当代码缩小时,不能在Chrome中工作
当代码缩小时,我的BackboneJS集合突然无法在Chrome中工作。 我一直在搜索代码中的错误。但是在修复了一些bug之后,当我使用集合时,应用程序继续崩溃。如果我更改数组的集合,应用程序将工作,但执行中的下一个集合将再次剪切执行 我不得不说我的申请真的很大。我有一个包含大量信息的模型,它有嵌套的集合和模型 具有集合的模型的示例通常是失败的模型Javascript 突然,我的BackboneJS系列不再';当代码缩小时,不能在Chrome中工作,javascript,backbone.js,collections,Javascript,Backbone.js,Collections,当代码缩小时,我的BackboneJS集合突然无法在Chrome中工作。 我一直在搜索代码中的错误。但是在修复了一些bug之后,当我使用集合时,应用程序继续崩溃。如果我更改数组的集合,应用程序将工作,但执行中的下一个集合将再次剪切执行 我不得不说我的申请真的很大。我有一个包含大量信息的模型,它有嵌套的集合和模型 具有集合的模型的示例通常是失败的模型 var MyCollection = Backbone.Collection.extend({ model: VinculacionesGr
var MyCollection = Backbone.Collection.extend({ model: VinculacionesGrafo });
var MyParentModel= Backbone.Model.extend({
defaults: function () {
return {
mycollec: new MyCollection,
finDeCarga: false
};
},
initialize: function () {
_.bindAll(this);
},
....
loadData: function () {
var that = this;
sendRequest({
type: "post",
url: ..,
dataType: "xml",
data: { ... },
success: this.success
});
},
success: function(data) {
model = new ChildModel;
that.get("mycollec").add(model);
}
它可以在Firefox、Internet Explorer中正常工作。。。但有时在Chrome中,当代码准备生产时,它会失败。我的意思是当代码缩小时。在beggining,我们认为这是一个同步问题,但在通过数组更改所有集合之后,在其他不依赖于加载数据的集合中,它继续失败。所有带有错误的行都是这样的:that.get(“mycollec”).add(model);堆栈是下一个:
TypeError: Cannot read property 'operaciones' of null
at h.extend.get
at h.extend.set
at h.extend.add
at g.Model.extend.addItem
at f.extend.cargarNodosIniciales
下一个是addItem方法(与文本错误无关):
所有情况下,错误都与它为null的某些数据相关,但堆栈与错误文本无关。当代码模糊时,我们第一次检测到它,错误如下:
无法读取null的属性1
真正奇怪的是,当我更改数组的集合时(在该代码中,它将是mycollec:[]和push,而不是add)。错误不再出现,执行将继续,直到出现另一个类似的集合指令
我真的很害怕。这就像主干收藏被破坏了一样。它们有时工作得很好,在应用程序的其余部分,它们从未失败过。但它同样是一个部分(加载大量数据并添加大量html)破坏了主干,或者可能是内存泄漏
我真的迷路了。我很抱歉,因为我第一次写这个问题的时候缺少信息
先谢谢你。。。我确实需要帮助问题是您将成功函数定义错误。您刚刚执行了函数成功,并实际全局定义了它,而不是在Backbone.Model.extend参数中定义它
loadData:function(){...},
success:function(data){....},
当成功回调被触发时。它在视图中查找成功事件作为方法。但你一开始还没有定义它。您刚刚在localData
的范围内创建了一个函数
应该是这样的success:success
loadData: function () {
var that = this;
sendRequest({
type: "post",
url: ..,
dataType: "xml",
data: {...
},
success: this.success
});
},
success: function (data) {
model = new ChildModel;
that.get("mycollec").add(model);
}
现在该方法可用于视图。所以
success:this.success
对这个案例有效。我终于找到了解决方案@github的philfreo在主干存储库中回答了我的问题
这似乎只发生在chrome的第28版和第29版(beta版)中。在30版本(金丝雀)中,@philfreo说它有效
他建议我们执行以下3个选项中的任意一个:
+使用未统一的Backbonjs
+使用Chrome 30代替以前的版本
+缩小之前在Backbonejs代码中应用修补程序
另一种选择是混淆代码,而不是缩小代码。我把缩小和模糊的代码,并作出美化,然后我取代了源代码,它的工作。我不确定谷歌闭包中有哪些选项可以实现这一点。但这是可能的
这个补丁可以工作(第三个选项)!所以,如果有人犯了这个错误,我希望能帮助他。这是一个非常模糊的错误,可能需要很多时间才能找到解决方案。你有什么错误?我添加了它,很抱歉我忘了你有地方放置缩小版,以便我们可以复制吗?我认为缩小版没有帮助。我不确定我是否可以分享缩小版。是公司寄来的。您无法尝试该应用程序,因为它将要求您提供用户帐户。我还能为你做些什么呢?你还认为缩小版会有帮助吗?很抱歉,这不是问题所在。我写得太快了。就在那一刻,我就要失业了。我将编辑这个问题,并添加更多细节。我有几种这种结构的模型。使用this.get(“集合”)创建模型。有些人在方法内部成功,有些人在外部成功。我在这里编辑了它,但我忘了把它移到外面。所有这些模型在Chrome中执行的一段时间内都会失败。只是在Chrome中,有时,所以调试这个问题非常困难。很抱歉,这不是问题所在。我写得太快了。就在那一刻,我就要失业了。我将编辑这个问题,并添加更多细节。我有几种这种结构的模型。使用this.get(“集合”)创建模型。有些人在方法内部成功,有些人在外部成功。我在这里编辑了它,但我忘了把它移到外面。所有这些模型在Chrome中执行的一段时间内都会失败。只是在Chrome中,有时,所以很难调试这个问题。
success: this.success
loadData: function () {
var that = this;
sendRequest({
type: "post",
url: ..,
dataType: "xml",
data: {...
},
success: this.success
});
},
success: function (data) {
model = new ChildModel;
that.get("mycollec").add(model);
}