0

私は拡張Backbone.RelationalModelし、1対多の関係を持つモデルを持っていますが、そのモデルをパラメーターとして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属性は関数であり、この関数にはこれがないため、エラーが発生します。Backbone.RelationalModelがシリアル化さacquireれる理由がわかりません。_queue

4

1 に答える 1

0

なぜそうなっているのかわかりません。ただし、問題の解決に役立つ可能性のある情報は次のとおりです。

このacquireメソッドはBackbone.Semaphore、Backbone.Relational内のキューと同時実行性の管理に使用されるミックスインの一部です。セマフォミックスインは、を含むいくつかの異なるクラスに混合されRelationalModelます。

プライベート_permitsAvailableプロパティは、を使用してミックスイン自体の中でのみアクセスされますthis._permitsAvailable。エラーメッセージは、thisが未定義であるため、エラーが発生したことを示しています。これは、メソッドがFunction.callまたはで実行された場合にのみ発生する可能性がありFunction.applyます。

編集:問題は、jQueryがモデルの各プロパティを反復処理してモデルをシリアル化しようとしていること、およびプロパティが関数の場合はその関数を呼び出してその戻り値をシリアル化しようとしていることのようです。データ属性は実際にはモデルオブジェクト上になく、Model.attributesプロパティに格納されているため、これはバックボーンモデルでは使用できません。

Model.toJSONこの問題は、次のメソッドを使用してモデルオブジェクトをよりシリアル化しやすい形式に変換することで簡単に修正できます。

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

Model.toJSONドキュメントからの引用:

JSON文字列化のためにモデルの属性のコピーを返します。これは、サーバーに送信される前に、永続化、シリアル化、または拡張に使用できます。このメソッドの名前は、実際にはJSON文字列を返さないため、少しわかりにくいですが、JSON.stringifyのJavaScriptAPIが機能する方法ではないかと思います。

また、の関連モデルのシリアル化を回避するために、backbone-relationalのincludeInJSONオプションがfalseに設定されていることを確認する必要があります。reverseRelationmodel.attributes

于 2013-02-04T08:37:23.747 に答える