在emberjs中使用Fixture数据加载路径时出错

时间:2013-10-28 13:22:41

标签: jquery ember.js handlebars.js

我实际上是按照exact procedure to produce ToDOMVC制作了这个,但我无法弄明白为什么我会在下面收到错误:

  

断言失败:#each循环的值必须是数组。

     

你通过了(生成的问题控制器)ember.js:394 Uncaught   TypeError:Object [object Object]没有方法'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-->

的application.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
 }
];

3 个答案:

答案 0 :(得分:0)

您没有正确宣布您的路线。对于问题路线,您需要创建Equizz.QuestionsRoute,而不是Equizz.EquizzRoute。

为了能够在模板中使用{{#each}},控制器必须是ArrayController。如果相应的路由从模型挂钩返回一个数组,则自动生成的控制器应该就是这个。由于您没有QuestionRoute返回数组模型,因此Ember正在生成默认的非阵列控制器。

您应该阅读docs regarding routes,解释整个路由/控制器/视图命名方案。

答案 1 :(得分:0)

Ember.js依赖于它自己的一组naming conventions。路线'问题'有一个名为QuestionRoute的Ember.Route。因此

Equizz.EquizzRoute =&gt; Equizz.QuestionRoute。

Ember灯具也有自己的"naming" conventions,并且必须具有唯一ID。因此

qid => id

这也意味着ember拥有与模型相关联的自己的ID概念,因此不需要模型的自定义ID。

答案 2 :(得分:0)

我跟随另一个教程遇到了同样的问题。

与@Dawson提到的一样,Fixture Adapter遵循与REST适配器不同的规则。以下是link @Dawson提供的相关文字:

  

任命公约

     

与REST适配器不同,Fixture Adapter不做任何   关于模型命名约定的假设。如你所见   如果您在上面将属性声明为firstName,则上面的示例   DS.Model.extend,您使用firstName表示您的相同字段   夹具数据。

     

重要的是,您应该确保灯具中的每条记录   数据具有唯一可识别的字段。默认情况下,Ember Data假定   这个键叫做id。你不应该提供你的id字段吗?   固定装置,或不覆盖主键,夹具适配器将   抛出错误。

解决这个问题:

假设我的模型被称为Itemitem.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'),
});

我在另一个对象中构建了我的Fixture数据:

//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。