0

我有一个扩展的模型,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函数,这个函数将没有这个,所以我得到错误,我不知道为什么_queueBackbone.RelationalModel会被序列化?

4

1 回答 1

0

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

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

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

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

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

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

引用Model.toJSON 文档

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

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

于 2013-02-04T08:37:23.747 回答