除非首先在DevTools控制台中进行评估,否则Backbone model.save()会失败

时间:2014-11-04 22:17:53

标签: javascript backbone.js

我在Backbone视图中有这个功能:

updateToServer: function(e) {
    e.preventDefault();
    var id = e.target.getAttribute('data-id');
    var file = this.collection.get(id);
    var data = {};
    $(e.target).serializeArray().map(function(x) {data[x.name] = x.value;});
    file.save(data);
    this.$el.modal('hide');
}

如果我允许自然运行,我会在undefined is not a function上获得file.save(data)。但是,如果我在{@ 1}}的Chrome DevTools中设置断点并在恢复之前在控制台中手动评估该功能,则file.save(data)个函数都可以正常工作。

为什么会发生这种情况,我该如何解决?

如果您需要其他上下文,请点击整个视图:https://gist.github.com/raddevon/d3ddf1bba101b6b67c4b#file-supportfilesview-js-L155-L163

更新:新发现:在第二次运行时,这有效。我在表格提交上有一个平庸的听众。当我第一次单击提交按钮时,我收到错误。如果我再次单击,模型将保存。

2 个答案:

答案 0 :(得分:1)

你能试试吗

updateToServer: function(e) {
    e.preventDefault();
    var id = e.target.getAttribute('data-id');
    var file = this.collection.get(id);
    var data = {};
    $(e.target).serializeArray().map(function(x) {data[x.name] = x.value;});        
    this.$el.modal('hide');

    setTimeout(function(){
        file.save(data);
    }, 200); //try with different values for timer

}

我添加了一个200毫秒的计时器。

这可能不是您的实际解决方案,但至少您会知道在文件'之前是否存在一些异步内容。实际上是形成的。

尝试不同的计时器值。我的意思是继续增加计时器,看看你是否仍然无法摆脱错误。

一旦你确定'文件'异步形成,然后你可以看看为什么会发生这种情况。 并尝试console.log而不是调试器进行调试,以便您可以在不暂停执行的情况下进行测试。

希望有所帮助。

答案 1 :(得分:0)

这完全不是我所怀疑的,在没有意识到的情况下,我没有在问题中提供足够的信息。我的代码中触发异常的行是file.save(),但实际异常发生在Backgrid中。

我提供了一个表单,允许用户从网格中显示的集合中更新模型。特定列被定义为整数列,但我没有将来自表单的值转换为整数。结果,Backgrid试图在字符串上运行toFixed。我修改了表单序列化代码,将只包含整数的字符串转换为整数。现在,一切都按预期工作。

这是序列化代码:

$(e.target).serializeArray().map(function(x) {
    data[x.name] = x.value === 'on' ? true : x.value;
    if (!isNaN(parseInt(data[x.name])) && isFinite(data[x.name])) {
        data[x.name] = parseInt(data[x.name]);
    }
});

如果我不得不猜测,我会说这可能有点天真,但它似乎在我的应用程序中运作良好。

感谢大家的帮助!