即使成功,也会触发错误回调

时间:2011-08-17 08:59:08

标签: backbone.js coffeescript

我的语法应该有一个小故障,或者我不理解的东西,但是当我在模型上做一个保存方法时。无论方法的结果如何,都会调用错误回调。

    @new_activity = new Activity()

    @new_activity.save
        know: $('input#know').val()
        learn: $('input#learn').val()

        success: -> console.log 'success'
        error: -> console.log 'error'

在我的情况下,因为我不知道new_activity是否已经有效地通过了验证,所以我必须做一个丑陋的技巧来将活动添加到集合中。 (顺便说一下,我不使用create方法,因为我确实想要有不同的错误,而不是简单的“假”。

    if @new_activity.has('know') and @new_activity.has('learn')
        app.collections.activities.add @new_activity

虽然它成功了;有一个创建的模型的警报。

修改:更多详情。 这是我的模型:     初始化: - >         _.bindAll @,'validate','errorHandler'         @ .bind'error',@ errorHandler

validate: (attrs) ->
    errors = []
    # We only support a certain number of languages, we enforce that the user does not select a wrong set.
    if _.isEmpty(_.intersection([attrs.know], ['en', 'fr'])) is true
        errors.push 'This language is not currently supported.'

    if _.isEmpty(_.intersection([attrs.learn], ['en', 'fr', 'de', 'es', 'zh', 'pt', 'ar', 'ja', 'ru'])) is true
        errors.push 'You cannot learn this language yet.'

    if _.isEmpty(errors) is false
        errors

errorHandler: (model, error) ->
    console.log error

验证发生时,如果validate方法没有返回任何内容,它仍会触发错误事件,错误变量包含模型(但没有错误消息)。

3 个答案:

答案 0 :(得分:4)

您应该检查new_activity是否已正确保存,请验证服务器是否返回对PUT请求的成功响应。

此外,我在使用Rails 3.1标准format.json { head :ok }时遇到了问题,因为它返回单个空格作为响应,application / json作为内容类型。然后Backbone尝试解析JSON并因错误而死亡。

答案 1 :(得分:4)

问题是Rails使用head :ok发回的单个空间。如果你发回一个空字符串,Backbone可以很好地处理它。

这样做的正确方法是发回204 No Content。您可以将head :ok替换为head :no_content块中的format.json来实现。 Rails不会发回HTTP正文中的任何内容。

答案 2 :(得分:0)

我不确定您的错误的原因是什么,但我想我可以帮助您确定错误:

查看Backbone.js的annotated source,您可以看到save()推迟到sync(),而error又推迟到jQuery的$.ajax。最终,您的wrapError函数(由Backbone的jqXHR包装)从中调用。

不幸的是,包装器会丢弃除wrapError参数之外的所有参数,这使调试变得有点棘手。所以你可能想尝试攻击你的本地Backbone.js源文件,用这样的东西替换现有的var wrapError = function(onError, model, options) { return function(jqXHR, textStatus, errorThrown) { console.log(jqXHR); console.log(textStatus); console.log(errorThrown); if (onError) { onError(model, jqXHR, options); } else { model.trigger('error', model, jqXHR, options); } }; }; 函数:

{{1}}

然后,至少,您将在控制台上看到jQuery提供的所有调试数据。