3

突然,当代码被缩小时,我的 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: [] 并 push 而不是 add。)该错误不再出现,并且继续执行,直到遇到另一个类似的集合指令。

我真的很害怕。这就像骨干收藏品被破坏了。它们有时运行良好,并且在应用程序的其余部分中它们永远不会失败。但它与该部分相同(加载大量数据并添加大量 html)破坏了主干,或者可能存在内存泄漏?

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

非常感谢...我真的需要帮助

4

3 回答 3

1

问题是您错误地定义了成功函数。您刚刚完成了功能成功并实际在全局范围内定义它,而不是在 Backbone.Model.extend 参数中定义它

loadData:function(){...},
success:function(data){....},
于 2013-07-29T15:04:11.367 回答
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将适用于这种情况。

于 2013-07-29T16:40:47.663 回答
1

最后我得到了解决方案。来自 github 的 @philfreo 在 Backbone 存储库https://github.com/jashkenas/backbone/issues/2701中回答了我的票

它似乎只发生在 chrome 的 28 和 29 (beta) 版本中。在 30 版本(金丝雀)中,@philfreo 说它有效。

他建议我们执行以下 3 个选项中的任何一个: + 使用未缩小的 Backbonjs + 使用 Chrome 30 而不是以前的版本 + 在缩小之前在 Backbonejs 代码中应用补丁https://github.com/elasticsales/backbone/commit/ba6e681cb898f2596899c8079d327cdd9c2f33fc

另一种选择是混淆代码并且不缩小它。我采用了缩小和混淆的代码并进行了美化,之后我替换了源代码并且它可以工作。我不确定谷歌关闭的选项是什么。但这是可能的。

补丁有效(第三个选项)!所以我希望帮助某人,如果他有这个错误。这是一个非常晦涩难懂的错误,可能需要花费大量时间才能找到解决方案。

于 2013-07-31T07:11:13.010 回答