突然,当代码缩小时,我的BackboneJS集合在Chrome中不起作用

时间:2013-07-29 13:19:48

标签: javascript backbone.js collections

当代码缩小时,我的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)打破了主干,或者可能是内存泄漏?

我真的迷路了。我很抱歉,因为我第一次写这个问题时缺乏信息。

提前多多感谢...我真的需要帮助

3 个答案:

答案 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代码中应用补丁

另一个选择是混淆代码而不是缩小代码。我采用了缩小和混淆的代码并做了一些美化,之后我更换了源代码并且它有效。我不确定谷歌关闭的选项是什么。但它有可能。

补丁有效(第三种选择)!如果他有这个错误,我希望能帮助别人。这是一个非常模糊的错误,可能需要花费大量时间才能找到解决方案。