Подтвердить что ты не робот

Ember 1.0.0 Ошибка RESTAdapter

Я не могу отслеживать источник этой ошибки:

Утверждение не выполнено: модель не найдена для '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()
});

Шаблоны Handlebars

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

Спасибо за вашу помощь!

4b9b3361

Ответ 1

Ответ от сервера, вероятно, не отформатирован правильно. У JSON должен быть корень с тем же именем, что и ваша модель. Смотрите: http://emberjs.com/guides/models/the-rest-adapter/#toc_json-root Ваш ответ должен выглядеть примерно так:

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

Ответ 2

В вашем bindAttr вы используете объект story, поэтому вам нужно сменить помощника {{#each}}, чтобы сделать ссылку на этот объект:

...
{{#each story in model}}
  <li class="storyLine">
    <ul>
      <li id="colorSwatch" {{bindAttr class=story.color}}></li>
      <li class="board">dddd</li>
    </ul>
  </li>
{{/each}}
...

Надеюсь, что это поможет.

Ответ 3

Я получил аналогичную ошибку при переходе от расширенного 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.

Надеюсь, что это поможет...