3

実際に正確な手順に従って ToDOMVC を生成してこれを作成しましたが、以下のエラーが発生する理由を世界で理解できません。

アサーションに失敗しました: #each がループする値は配列でなければなりません。

渡されました (生成された質問コントローラー) ember.js:394 Uncaught TypeError: Object [object Object] has no method 'addArrayObserver'

以下はコードです

index.html

    <script type="text/x-handlebars" data-template-name="questions"><!--ACW-not sure should be question or equizz-->
                <ul id="question-list" >
                    {{#each}}
                        <li>
                            <h3>{{title}}</h3>
                        </li>
                        <li>
                            <p>{{desc}}</p>
                        </li>
                    {{/each}}
                </ul>
</script><!--template END-->

アプリケーション.js

window.Equizz = Ember.Application.create();
Equizz.ApplicationAdapter = DS.FixtureAdapter.extend();

router.js

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

Equizz.EquizzRoute = Ember.Route.extend({
  model: function () {
    return this.store.find('question');
  }
});

question.js

Equizz.Question = DS.Model.extend({
    qid: DS.attr('string'),
    category: DS.attr('string'),
    type:DS.attr('string'),
  title: DS.attr('string'),
    desc: DS.attr('string'),
    diff_level: DS.attr('string'),
  answer: DS.attr('boolean')
});

Equizz.Question.FIXTURES = [
 {
    qid: '1',
    category: 'Track',
    type:'True & False',
  title: 'Get 100 in the quizz is the most disgraced act in simulator lab.',
    desc: 'think clearly, you should know the answer without use your brain...',
    diff_level: 'Hard',
  answer: false
 },
 {
    qid: '2',
    category: 'Common',
    type:'True & False',
  title: 'You are allowed to eat in simulator lab.',
    desc: 'Like what? Halal?',
    diff_level: 'Medium',
  answer: false
 },
 {
    qid: '3',
    category: 'BS',
    type:'True & False',
  title: 'fsafasf asf asjfkl; as fkasl; faf a;sf sf asfl; sjlfjs a; fsl fas;f dsaf aslfj asl;fj a;fj alfj slafj a?',
    desc: 'Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?Like what? Halal?',
    diff_level: 'Easy',
  answer: true
 }
];
4

3 に答える 3

0

Ember.js は、独自の一連の命名規則に依存しています。ルート「質問」には、QuestionRoute という名前の Ember.Route があります。したがって

Equizz.EquizzRoute => Equizz.QuestionRoute.

Ember フィクスチャには独自の「命名」規則もあり、一意の ID が必要です。したがって

qid => id

これは、ember にはモデルに関連付けられた独自の ID の概念があることも意味するため、モデルのカスタム ID は必要ありません。

于 2014-02-24T05:46:48.117 に答える
0

ルートを正しく宣言していません。質問ルートについては、Equizz.EquizzRoute ではなく、Equizz.QuestionsRoute を作成する必要があります。

テンプレートで {{#each}} を使用できるようにするには、コントローラーが ArrayController である必要があります。対応するルートがモデル フックから配列を返す場合、自動生成されたコントローラーはこれだけである必要があります。配列モデルを返す QuestionsRoute がないため、Ember はデフォルトの非配列風のコントローラーを生成しています。

ルートに関するドキュメントを読む必要があります。ルート/コントローラー/ビューの命名スキーム全体について説明しています。

于 2013-10-28T13:55:31.853 に答える
0

別のチュートリアルに従って、同じ問題に遭遇しました。

@Dawson が述べたように、Fixture Adapter は REST アダプターとは異なるルールに従います。@Dawsonが提供したリンクからの関連テキストは次のとおりです。

命名規則

REST アダプターとは異なり、Fixture アダプターは、モデルの命名規則について何の仮定も行いません。上記の例で見たように、DS.Model.extend で属性を firstName として宣言すると、firstName を使用してフィクスチャ データの同じフィールドを表します。

重要なのは、フィクスチャ データの各レコードに一意に識別可能なフィールドがあることを確認する必要があることです。デフォルトでは、Ember Data はこのキーが id と呼ばれるものと想定します。フィクスチャに id フィールドを提供しない場合、または主キーをオーバーライドしない場合、Fixture Adapter はエラーをスローします。

これを回避するには:

Item私のモデルが(item.js)と呼ばれていると仮定します

import DS from 'ember-data';

var Item = DS.Model.extend({
    title: DS.attr('string'),
    description:  DS.attr('string'),
    price:  DS.attr('number'),
    qty: DS.attr('number'),
    images: DS.attr('string'), 
    sold: DS.attr('boolean'),
});

フィクスチャ データを別のオブジェクトに作成しました。

//Fixtures require an ID field not supplied by the DS.model
//write the fixtures to an object then append IDs in a loop later
var f = [
        {
            title: "Nesting Tables",
            description: "Set of 3 matching nesting tables in a cherry finish",
            price: "25",
            qty: 1,
            images: '"DSC_0552.JPG"', 
            sold: false
        },
        {
            title: "Brown Leather Storage Ottomans",
            description: "Nicely finished with nail-head rivets.",
            price: "45",
            qty: 2,
            images: '"DSC_0554.JPG","DSC_0556.JPG"', 
            sold: false 
        },
        {
            title: "Black 3 shelf bookcase",
            description: "Handsome black wood bookcase with 3 shelves",
            price: "40",
            qty: 1,
            images: '"DSC_0559.JPG","DSC_0557.JPG"', 
            sold: false 
        }
]; 

次に、ループを使用して各要素に ID を追加します。

// here is our loop to add IDs to the fixtures 
var c = f.length; 
for (var i=0; i<c;i++)
{
   f[i].id = i; 
}

f次に、完成したオブジェクトをFIXTURESモデル内のオブジェクトに割り当てます。

Item.reopenClass({
    FIXTURES: f
});

このようにすると、Fixtures は最終的な REST データのように見えますが、FixtureAdapter を使用するために必要な部分は整っています。

于 2014-08-22T14:17:48.390 に答える