2

バックボーン コレクションがあります

jQuery ->
  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

ページの読み込み時にコレクションを初期化しようとしています:

var list = new App.Collections.List;
list.reset(<%= @data.to_json.html_safe %>)

これにより、バックボーン ライブラリで JS エラーがスローされます。

Uncaught TypeError: undefined is not a function application.js:597
f.extend._prepareModel application.js:597
f.extend.add application.js:591
f.extend.reset application.js:595
(anonymous function)

ただし、コードを次のように変更すると:

var list = new Backbone.Collections;
list.reset(<%= @data.to_json.html_safe %>)

リセットが機能し、コレクションが作成されます。コレクション内のオブジェクトは、ListItem オブジェクトであることを認識していないようです。カスタム コレクションのすべてのリセットに対して何か特別なことをする必要がありますか?

4

2 に答える 2

7

スタックトレース行は、_prepareModelコレクションの後にモデルが宣言されていることを示すヒントを提供します。

ほとんどの場合、コードは次のように設定されています。


  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

  class App.Models.ListItem extends Backbone.Model

コレクションの属性ListItemで使用しようとすると、まだ宣言されていないため、失敗します。model基本的に、モデル属性をに設定していますundefined

最初にモデルを宣言する必要があります。


  class App.Models.ListItem extends Backbone.Model

  class App.Collections.List extends Backbone.Collection
    model: App.Models.ListItem

これはCoffeeScriptまたはBackboneの制限ではないことに注意してください。これは、オブジェクトリテラルの使用によって引き起こされるJavaScriptの動作です。オブジェクトリテラルのキーと値のペアの値はすぐに評価されます。つまり、存在する必要があります。そうでない場合は、未定義またはその他のエラーとして返されます。

于 2012-06-04T16:32:43.677 に答える
0

デリックが最初にモデルを宣言する必要があると言ったように、その目的のために、私は通常、App.coffee(メインバックボーンファイル)のrequire orderをこれに変更するだけです

...
require_tree ./models
require_tree ./collections
...
于 2012-12-10T00:51:29.373 に答える