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>
Спасибо за вашу помощь!
Ответы
Ответ 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.
Надеюсь, что это поможет...