2015-03-23 8 views
0

Я ember.js новичка и облицовочные ежедневные проблемы :-)ember.js, Как загрузить связанные модели при загрузке основной модели с сервера, который не поддерживает sideloading

Сегодня проблема заключается в моем внутреннем сервер не поддерживает боковой загрузчик. (Если я правильно понял «sideload» правильно, то сервер возвращает связанные модели сразу с несколькими корень JSON)

, например, мой сервер возвращает только ниже по запросу:

для /api/v1/posts.json

{ 
    posts: [{ 
    id: 91, 
    title: "ember.js" 
    }, { 
    id: 81, 
    title: "ember-data.js" 
    }] 
} 

для /api/v1/comments.json

{ 
    comments: [{ 
    id: 928, 
    postId: 91, 
    }, { 
    id: 927, 
    postId: 92, 
    }] 
} 

Когда я загружаю post модель, перейдите /#/posts, вид didnot визуализации comment, но если я загружаю comment вручную, введя URL-адрес comment route в строке местоположения, /#/comments, и вернитесь, комментарии отображаются правильно.

, так что я просто попробовать, как это, в post route (третья строка)

App.PostsRoute = Ember.Route.extend({ 
    model: function(params) { 
    this.store.find('comment'); 
    return this.store.find('post'); 
    } 
}) 

и это работает! (загружайте и заполняйте комментарий тоже!), но я думаю, что это неправильный путь.

Есть ли какой-либо хороший или правильный способ сделать это?

Редактировать - добавить определения модели

Мой пост модель что-то вроде:

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    content: DS.attr('string'), 
    comments: DS.hasMany('comment', {async: true}), 
}) 

и комментариев модели:

App.Account = DS.Model.extend({ 
    content: DS.attr('string'), 
    post: DS.belongsTo('post'), 
}) 

Я не использую ember-cli и начал с ember-starter-kit и посмотреть некоторые учебные пособия с домашней и веб-страницы.

И я использую обычай Adapter, потому что мой бэкэндом, в FACK, не поддерживает уголек стиль ответа JSON, и я не могу прикоснуться к ней:

App.SpinAdapter = DS.ActiveModelAdapter.extend({ 
    host: 'http://spin.example.com:8080', 
    namespace: 'api/v1', 

    init: function() { 
    this._super(); 
    console.log('SpinAdapter...'); 
    } 
}); 

App.SpinSerializer = DS.ActiveModelSerializer.extend({ 
    extract: function(store, type, payload, id, requestType) { 
    console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType); 
    return payload; 
    }, 
}); 

App.PostAdapter = App.SpinAdapter.extend({}); 
App.PostSerializer = App.SpinSerializer.extend({}); 

App.CommentAdapter = App.SpinAdapter.extend({}); 
App.CommentSerializer = App.SpinSerializer.extend({}); 
+0

Можете ли вы показать нам определение модели 'post'? –

+0

@torazaburo, я добавляю свои определения моделей и адаптеров. – sio4

ответ

0

Я нашел ответ в то время как я думаю, больше после того, как я редактировать вопрос!

проблема переопределена extract способ. (подробности на мой вопрос., Can I use normal (rails default) JSON response on Ember Data?)

Когда я переопределяю весь extract, как ответ на вопрос, я обнаружил, что некоторые методы не были вызваны. (возможно, _super.extract делает больше других вещей.), поэтому я только что протестировал с моделью extract с минимальным переопределением и вызовом super. и это работает!

изменил extract методы:

App.SpinAdapter = DS.ActiveModelAdapter.extend({ 
    host: 'http://spin.example.com:8080', 
    namespace: 'api/v1', 

    init: function() { 
    this._super(); 
    console.log('SpinAdapter...'); 
    } 
}); 

App.SpinSerializer = DS.ActiveModelSerializer.extend({ 
    extract: function(store, type, payload, id, requestType) { 
    console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType); 
    return this._super(store, type, payload, id, requestType); 
    }, 
}); 

App.PostAdapter = App.SpinAdapter.extend({}); 
App.PostSerializer = App.SpinSerializer.extend({ 
    extract: function(store, type, payload, id, requestType) { 
    return this._super(store, type, {posts: payload}, id, requestType); 
    }, 
}); 

App.CommentAdapter = App.SpinAdapter.extend({}); 
App.CommentSerializer = App.SpinSerializer.extend({ 
    extract: function(store, type, payload, id, requestType) { 
    return this._super(store, type, {comments: payload}, id, requestType); 
    }, 
}); 

Проблема решена. но, к сожалению, поскольку ответ posts не имеет записи о comments, (структура базы данных и API «только ребенок знает своих родителей»). Если я сначала загружаю сообщение, соответствующие комментарии не загружаются. решение половины.

Я просто пробовал с вложенными маршрутами и надеюсь загрузить загружаемый вложенный URL автоматически, но этого не произойдет. :-(

 Смежные вопросы

  • Нет связанных вопросов^_^