当代码缩小时,我的BackboneJS系列突然无法在Chrome中运行。 我一直在寻找代码中的错误。但是在修复了一些错误之后,应用程序在我使用集合时会继续破坏。如果我更改数组的集合,则应用程序可以正常工作,但执行中的下一个集合将再次执行。
我不得不说我的申请非常庞大。我有一个包含大量信息的模型,它有嵌套的集合和模型。
带有集合的模型示例通常是失败的模型。
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中失败。我的意思是代码缩小了。在开始时,我们认为这是一个同步问题,但在通过数组更改所有集合后,它继续在其他不依赖于加载数据的集合中失败。总之,带错误的行是: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方法是下一个(与文本错误无关):
addItem: function (item) {
this.get("nodos").add(item);
},
总而言之,错误与某些数据相关,即它为空,但堆栈与错误文本无关。当代码混淆并且我们第一次检测到它时,错误是这样的:
无法读取null的属性1。
真正奇怪的是,当我更改数组的集合时(在该代码中它将是mycollec:[]并推送而不是添加。)该错误不再出现并且执行继续进行直到它来到另一个类似收集说明。
我真的很害怕。这就像骨干集合被打破了。它们有时运行良好,在应用程序的其余部分中它们永远不会失败。但是同样的那个部分(加载大量数据并添加大量的html)打破了主干,或者可能是内存泄漏?
我真的迷路了。我很抱歉,因为我第一次写这个问题时缺乏信息。
提前多多感谢...我真的需要帮助
答案 0 :(得分:1)
问题是你定义了成功函数错误。你刚刚做了功能成功并实际定义了它,而不是在Backbone.Model.extend参数中定义它
loadData:function(){...},
success:function(data){....},
答案 1 :(得分:1)
success: this.success
触发成功回调时。它将成功事件视为视图上的方法。但是你没有首先定义它。您刚刚在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
适用于此案例。
答案 2 :(得分:1)
最后我得到了解决方案。来自github的@philfreo在Backbone存储库https://github.com/jashkenas/backbone/issues/2701
中回复了我的票它似乎只发生在版本28和29(beta)的chrome中。在30版本(金丝雀)@philfreo说它有效。
他建议我们做以下3个选项中的任何一个: +使用未经分类的Backbonjs +使用Chrome 30代替以前的版本 +在缩小https://github.com/elasticsales/backbone/commit/ba6e681cb898f2596899c8079d327cdd9c2f33fc
之前在Backbonejs代码中应用补丁另一个选择是混淆代码而不是缩小代码。我采用了缩小和混淆的代码并做了一些美化,之后我更换了源代码并且它有效。我不确定谷歌关闭的选项是什么。但它有可能。
补丁有效(第三种选择)!如果他有这个错误,我希望能帮助别人。这是一个非常模糊的错误,可能需要花费大量时间才能找到解决方案。