0

私は Ember について理解しようとしており、todos チュートリアルを進めています。ここでdisplay -model-dataステップに行き詰まります http://emberjs.com/guides/getting-started/displaying-model-data/

チュートリアルからコピーして貼り付けたJavaScriptは次のとおりです。

window.Todos = Ember.Application.create();

Todos.Router.map(function () {
  this.resource('todos', { path: '/' });
});

Todos.TodosRoute = Ember.Route.extend({
  model: function () {
    return Todos.Todo.find();
  }
});

Todos.Store = DS.Store.extend({
  revision: 12,
  adapter: 'DS.FixtureAdapter'
});

Todos.Todo = DS.Model.extend({
  title: DS.attr('string'),
  isCompleted: DS.attr('boolean')
});

Todos.Todo.FIXTURES = [
  {
    id: 1,
    title: 'Learn Ember.js',
    isCompleted: true
  },
  {
    id: 2,
    title: '...',
    isCompleted: false
  },
  {
    id: 3,
    title: 'Profit!',
    isCompleted: false
  }
];

次に、これが私のハンドルバーのテンプレートです。

...
          {{#each controller}}
            <li>
              <input type="checkbox" class="toggle">
              <label>{{title}}</label><button class="destroy"></button>
            </li>
          {{/each}}

それでも、このエラーが発生します

Uncaught Error: assertion failed: an Ember.CollectionView's content must implement Ember.Array. You passed <(generated todos controller):ember257> 

Ember が生成するデフォルトのコントローラー オブジェクトは、Ember.Array 型である必要があるように見えますが、何らかの理由で発生していません。ember-data に問題があるのでしょうか?

スターター キットのすべてのファイルを使用しています。これらは、ember 1.0.0 rc5 ハンドルバー 1.0.0 rc4 jquery 1.9.1 および ember-data です。唯一のバージョン表示はコメントからのものです。

// Last commit: 3981a7c (2013-05-28 05:00:14 -0700)

誰かが知っている依存関係の問題がありますか、それとも私が何か間違ったことをしましたか?

4

3 に答える 3

2

そのモジュールはAPIとの対話と賢いモデルオブジェクトの提供のみを担当するため、emberデータの問題とは言えません。

ember が間違ったタイプのコントローラーを生成していると言ったのは正しかったです。デフォルトでControllerは、必要なものがArrayController. この問題を回避するには、次のような空のコントローラーを作成するだけです

Todo.TodosController = Em.ArrayController.extend({});

ガイドには、ember が を作成すると書かれていますArrayControllerが、おそらくもう作成されていません!? arraycontroller を明示的に作成することで機能するかどうか教えてください。その場合は、ember チームに知らせることができます。

于 2013-06-13T09:32:34.847 に答える
2

今日、入門ガイドを読んでいるときにまったく同じ問題が発生しましたが、タイプミスが原因のようです。

ドキュメントによると、生成されたコントローラーArrayController 型であると想定されています。Ember ソースを掘り下げたところ、コンテキストに応じてコントローラーを生成する Ember.generateController メソッドが見つかりました。ブレークポイントを設定したところ、Ember が「Todos」ルートのコントローラーを作成しようとしたときに、コンテキストが定義されていなかったため、基本的なコントローラーが生成されたことがわかりました。

そこからさかのぼって、ルーターのモデル関数にブレークポイントを設定して、それが何を返しているかを確認しましたが、まったく呼び出されていないことがわかりました。この時点で、私は何か間違ったことをしたのではないかと疑い始めました。そのとき、私は TodosRoute を TodosRouter と名付けたことに気付きました (元の質問にあるように)。名前を TodosRoute に変更すると、モデル関数が正しく呼び出され、すべてが期待どおりに機能しました。TodosController を ArrayController として明示的に作成した行を含める必要はありませんでした。

あなたの質問は正しかったようですが、他の誰かが同じ問題を抱えている場合に備えて、ここに投稿したいと思いました。

于 2013-06-30T18:41:28.790 に答える
0

Geviousが提案した行を追加すると、この問題が修正されました。明確にするために、私の router.js ファイルは次のようになります。

 Todos.Router.map(function(){
   this.resource('todos', {path: '/'});
});

Todos.TodosRoute = Ember.Route.extend({
  model: function () {
    return Todos.Todo.find();
  }
});

Todos.TodosController = Em.ArrayController.extend({});
于 2013-06-23T06:24:46.987 に答える