Ember 1.0.0 RESTAdapter失败

时间:2013-09-05 19:46:33

标签: ember.js ember-data

我似乎无法追查此错误的来源:

  

断言失败:未找到“0”的模型

服务器正在获取JSON,但应用程序在发送到模板之前发生错误。问题似乎发生在REST适配器和路由器之间。当我使用夹具适配器时,模板呈现无错误。

我正在使用Ember和Handlebars版本1.0.0。

这是我的应用代码:

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

App.ApplicationAdapter = DS.RESTAdapter.extend({
    host: 'http://localhost:3000'
});

App.Router.map(function() {
    this.resource("stories", { path: "/" }, function() {
        this.resource("boards", { path: "/boards"} )
    });
});

App.StoriesRoute = Ember.Route.extend({
    model: function() {
        return this.store.findAll('story');
    }
});

attr = DS.attr;

App.Story = DS.Model.extend({
    color: attr()
});

把手模板

    <script type="text/x-handlebars">
    {{ outlet }}

    </script>

    <script type="text/x-handlebars" data-template-name="stories">
    <ul>
        <li class="storyLine">
            <ul>
                <li id="colorSwatch"></li>
                <li class="board">+</li>
            </ul>
        </li>
    </ul>
    <ul>
    {{#each model}}
        <li class="storyLine">
            <ul>
                <li id="colorSwatch" {{bindAttr class=story.color}}></li>
                <li class="board">dddd</li>
            </ul>
        </li>
    {{/each}}
    </ul>
    </script>

感谢您的帮助!

3 个答案:

答案 0 :(得分:25)

服务器的响应可能没有正确格式化。 JSON需要具有与模型同名的根。请参阅:http://emberjs.com/guides/models/the-rest-adapter/#toc_json-root 您的回复需要看起来像这样:

{
  "story": [
    {
      "id": 0,
      "title": "foo"
    },
    {
      "id": 1,
      "title": "bar"
    }
  ]
}

答案 1 :(得分:0)

在您使用对象bindAttr的{​​{1}}中,您应该更改story帮助程序以引用该对象:

{{#each}}

希望它有所帮助。

答案 2 :(得分:0)

从扩展FixtureAdapter转换为扩展RESTAdapter时,我遇到了类似的错误。我覆盖了finder - 方法之一。

虽然FixtureAdapter对一组对象完全满意

findQuery: function(store, type, query, array) {
    return DS.PromiseArray.create({
        promise: new Promise(function(resolve, reject){
            var results = [];
            store.findAll('source').then(function(sources) {
                sources.forEach(
                    function (rootSource) {
                       results.push( store.createRecord( ... ));
                    }
                );
                resolve(results);
            },reject);
        })
    });
}

对于相同的方法,RESTAdapter期望具有键和数组的对象为值

findQuery: function(store, type, query, array) {
    return new Ember.RSVP.Promise(function(resolve, reject){
        var results = [];
        store.find('source').then(function(sources) {
            sources.forEach(
                function (rootSource) {
                    results.push({ ... });
                }
            );
            resolve({"connections":results});
        },reject);
    });
},

查看resolve调用内的差异。

即使它像在FixtureAdapter中那样将对象放入数组中,也会导致错误 稍后当您尝试更改对象属性时Assertion failed: You must use Ember.set() to access this property

对于所有这些,我使用的是Ember 1.2.0,Ember Data:1.0.0-beta.7 + canary.b45e23ba。

希望这会有所帮助......