3

我实际上是按照精确的程序来制作 ToDOMVC来制作这个的,但我无法弄清楚为什么我会在下面出现错误:

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

您通过(生成的问题控制器)ember.js:394 Uncaught TypeError: Object [object Object] has no method 'addArrayObserver'

下面是代码

索引.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();

路由器.js

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

Equizz.EquizzRoute = Ember.Route.extend({
  model: function () {
    return this.store.find('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

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

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

您应该阅读有关 routes 的文档,解释整个 route/controller/view 命名方案。

于 2013-10-28T13:55:31.853 回答
0

Ember.js 依赖于它自己的一组命名约定。路线“问题”有一个名为 QuestionRoute 的 Ember.Route。因此

Equizz.EquizzRoute => Equizz.QuestionRoute。

Ember 设备也有自己的“命名”约定,并且需要有一个唯一的 id。因此

qid => id

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

于 2014-02-24T05:46:48.117 回答
0

在另一个教程之后,我遇到了同样的问题。

就像@Dawson 提到的那样,Fixture Adapter 遵循与 REST 适配器不同的规则。以下是@Dawson 提供的链接中的相关文本:

命名约定

与 REST Adapter 不同,Fixture Adapter 不对模型的命名约定做任何假设。正如您在上面的示例中看到的,如果您在 DS.Model.extend 期间将属性声明为 firstName,则使用 firstName 来表示夹具数据中的相同字段。

重要的是,您应该确保夹具数据中的每条记录都有一个唯一可识别的字段。默认情况下,Ember Data 假定此键称为 id。如果您没有在您的灯具中提供 id 字段,或者没有覆盖主键,灯具适配器将抛出错误。

要解决此问题:

假设我的模型被称为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; 
}

然后将完成的fObject分配给FIXTURES模型中的对象:

Item.reopenClass({
    FIXTURES: f
});

这样,Fixture 看起来就像我的最终 REST 数据,但我有必要的部分来使用 FixtureAdapter。

于 2014-08-22T14:17:48.390 回答