【问题标题】:Send BackboneRelational as ajax data将 BackboneRelational 作为 ajax 数据发送
【发布时间】:2013-02-04 08:04:45
【问题描述】:

我有一个扩展 Backbone.RelationalModel 并且具有一对多关系的模型,当我尝试以该模型作为参数发送 ajax 请求时出现问题。

$.ajax(
        url: 'save'
        type: 'POST'
        data:
          project: MyApp.project
      )

我收到以下错误 Uncaught TypeError: Cannot read property '_permitsAvailable' of undefined 它出现在名为 acquire 的方法中 谁能告诉我为什么会这样?

编辑:

在挖掘错误原因后,我发现jQuery.param函数定义了add(key, value)函数,在某些时候这个value属性是acquire函数,这个函数将没有这个,所以我得到了错误,不知道为什么Backbone.RelationalModel的_queue会被序列化?

【问题讨论】:

    标签: jquery backbone.js backbone-relational


    【解决方案1】:

    我不知道为什么会这样。不过,这里有一些信息可能会帮助您解决问题:

    acquire 方法是Backbone.Semaphore 的一部分,Backbone.Semaphore 是用于 Backbone.Relational 中的队列和并发管理的 mixin。信号量 mixin 混合到几个不同的类中,包括 RelationalModel

    私有的_permitsAvailable 属性只能在mixin 内部使用this._permitsAvailable 访问。您的错误消息告诉您发生了错误,因为 this 未定义。只有在使用Function.callFunction.apply 执行方法时才会发生这种情况。

    编辑: 问题似乎是 jQuery 试图通过迭代模型的每个属性来序列化模型,如果属性是函数,则调用该函数并序列化其返回值。这对于 Backbone 模型来说是不行的,因为数据属性实际上并不在模型对象上,而是存储在 Model.attributes 属性中。

    通过使用Model.toJSON 方法将模型对象转换为对序列化更友好的格式,应该可以轻松解决此问题:

    $.ajax(
      url: 'save'
      type: 'POST'
      data:
        project: MyApp.project.toJSON()
    )
    

    引用Model.toJSON documentation:

    返回模型属性的副本以进行 JSON 字符串化。这可用于持久性、序列化或在发送到服务器之前进行扩充。这个方法的名字有点令人困惑,因为它实际上并没有返回 JSON 字符串——但恐怕这是 JSON.stringify 的 JavaScript API 的工作方式。

    您还必须确保将主干关系的reverseRelation 中的includeInJSON 选项设置为false,以避免序列化model.attributes 中的相关模型。

    【讨论】:

    • 你是对的,该函数在没有来自 jQuery.param 函数的上下文的情况下被调用,我在问题中添加了一些信息。
    • 谢谢,当我使用骨干关系时,我不得不从属性中删除模型,如果您不介意,我将其添加到您的答案中。
    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2018-03-27
    相关资源
    最近更新 更多