我在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
更新:新发现:在第二次运行时,这有效。我在表格提交上有一个平庸的听众。当我第一次单击提交按钮时,我收到错误。如果我再次单击,模型将保存。
答案 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]);
}
});
如果我不得不猜测,我会说这可能有点天真,但它似乎在我的应用程序中运作良好。
感谢大家的帮助!