2015-06-29 3 views
0

Я использую уголек CLIКак сделать сериализатору дозвонились

Эмбер 1.12.0 Ember данных 1.0.0-beta.18

router.js:

import Ember from 'ember'; 
import config from './config/environment'; 

var Router = Ember.Router.extend({ 
    location: config.locationType 
}); 

Router.map(function() { 
    this.route('datasource'); 
}); 

//export default Router; 
export default Router; 

маршруты/datasource.js:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model: function() { 
    // the model is an Array of all of the posts 
    // fetched from this url 
    return Ember.$.ajax('/datasource/'); 
    //return [{'datasource': '1'}, {'datasource': '2'}]; 
    } 
}); 

адаптеры/application.js:

import DS from 'ember-data'; 

export default DS.Adapter.extend({ 
    // ...your code here 
}); 

модели/datasource.js:

import DS from 'ember-data'; 
export default DS.Model.extend({ 
    dsn: DS.attr() 
}); 

сериализаторы/datasource.js:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 

    extractArray: function(store, type, payload) { 

    var datasources = payload._items; 

    payload = {datasources: datasources}; 

    return this._super(store, type, payload); 

    } 


}); 

Т.е. мой апи возвращает список элементов внутри ключевых _items.

Но, похоже, сериализатором никогда не выполняется,

Что я должен сделать, чтобы сериализатор вступили в силу?

Это ошибка -

Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed '{_items: [object Object],[object Object], _links: [object Object], _meta: [object Object]}' (wrapped in (generated datasource controller))Ember.default.assert @ ember.debug.js:4854exports.default.CollectionView.default.extend._assertArrayLike @ ember.debug.js:38837(anonymous function) @ ember.debug.js:37836ContainerView.default.extend.init @ ember.debug.js:37804superWrapper @ ember.debug.js:17426superFunction @ ember.debug.js:13805mixin.Mixin.create.init @ ember.debug.js:38898superWrapper @ ember.debug.js:17426superFunction @ ember.debug.js:13805exports.default.CollectionView.default.extend.init @ ember.debug.js:38832superWrapper @ ember.debug.js:17426Class @ ember.debug.js:30649ClassMixinProps.create @ ember.debug.js:31071mixin.Mixin.create.createChildView @ ember.debug.js:35755merge.default.appendChild @ ember.debug.js:39847mixin.Mixin.create.appendChild @ ember.debug.js:35697appendTemplatedView @ ember.debug.js:8051viewHelper @ ember.debug.js:7559collectionHelper @ ember.debug.js:6410eachHelper @ ember.debug.js:6598block @ ember.debug.js:7807render @ datasource.js:89renderHTMLBarsTemplate @ ember.debug.js:8491renderView @ ember.debug.js:8463renderView @ ember.debug.js:35400mixin.Mixin.create.render @ ember.debug.js:35423EmberRenderer_createElement @ ember.debug.js:37468Renderer_renderTree @ ember.debug.js:9140scheduledRenderTree @ ember.debug.js:9216Queue.invoke @ ember.debug.js:878Queue.flush @ ember.debug.js:943DeferredActionQueues.flush @ ember.debug.js:748Backburner.end @ ember.debug.js:173(anonymous function) @ ember.debug.js:576 

ответ

1

В модели крюке вашего маршрута вы делаете вызов Ajax вместо вызова в магазин, чтобы найти записи. С помощью вызова ajax вы обходите свой магазин, и поэтому сериализатор никогда не будет вызываться для сериализации полезной нагрузки, возвращаемой с вашего сервера.

Чтобы передать полезную нагрузку в магазин вы можете сделать:

// route 
model: function() { 
    var store = this.store; 
    return Ember.$.ajax('/datasource/').then(function(payload) { 
     store.pushPayload('datasource', payload); 
    }); 
} 

В качестве альтернативы вы можете позвонить в магазин, чтобы сделать вызов на заднем конце, так что вам не придется делать AJAX вызова (не уверен, что по какой-то причине вы намеревались сделать заказ):

// route 
model: function() { 
    return this.store.find('datasource'); 
} 
Смежные вопросы