Как вызвать функцию данных Ember напрямую?

Есть ли способ вызвать функцию данных Ember, например, serialize функция, прямо внутри моего основного JavaScript индекса страницы?

Я старался DS.Serializer.serialize(myrecord), но я получил эту ошибку: has no method 'serialize',


Дополнительный вопрос:

Как я могу напрямую вызвать версию сериализации RESTAdapter? Они внесли некоторые изменения в универсальную сериализацию.

1 ответ

Решение

Есть ли способ вызвать функцию данных Ember, например, функцию сериализации, прямо внутри моего основного javascript страницы индекса?

И да и нет. Да, в этом нет ничего особенного в функциях ember-data (их можно вызывать откуда угодно), но нет, потому что вызов DS.Serializer.serialize(myrecord) не имеет смысла.

Вероятно, вы хотите сериализовать myrecord? В этом случае попробуйте:

myrecord.serialize()

serialize() Функция модели ember-data будет использовать сериализацию хранилища модели для возврата JSON-представления модели. Под капотом это означает вызов serialize() для экземпляра DS.Serializer. Смотрите DS.Model.serialize()

Я попытался DS.Serializer.serialize(myrecord), но я получил эту ошибку: не имеет метода 'serialize'

Правильно. DS.Serializer это класс и не имеет serialize метод. Так DS.Serializer.serialize(myrecord) не работает serialize Функция, с которой вы связаны, является методом экземпляра, поэтому она будет доступна в экземплярах DS.Serializer учебный класс. Тем не менее, DS.Serializer является абстрактным базовым классом, поэтому нет смысла создавать его экземпляр и пытаться вызывать его. serialize() на что.

Более подробную информацию о том, как работают сериализаторы ember-data, можно найти в [serializer api docs] ( https://github.com/emberjs/data/blob/761412849a56ad086c44659faafa547d8f6c03a8/packages/ember-data/lib/system/serializer.js#L10-L211)

- ОБНОВЛЕНО для дополнительного вопроса: -

Как я могу напрямую вызвать версию сериализации RESTAdapter? Они внесли некоторые изменения в универсальную сериализацию.

Если вы используете RESTAdapter, вы можете просто позвонить model.serialize() на модели. Но в редком случае, когда ваши модели используют что-то другое (например, FixtureAdapter) и вам нужны функции сериализации RESTSerializer, вы можете создать сериализатор, используя DS.RESTSerializer.create({}) а затем передать свою модель его serialize() метод. Например:

App = Ember.Application.create();
App.Store = DS.Store.extend({adapter: 'DS.FixtureAdapter'});
App.Post = DS.Model.extend({
  title: DS.attr('string'),
  bodyText: DS.attr('string')
});
App.ApplicationRoute = Ember.Route.extend({
  model: function() {
    return App.Post.createRecord({title: 'This is my post', bodyText: 'There are many like it but this one is mine'});
  },
  afterModel: function(model, transition) {
    var serializer = DS.RESTSerializer.create({});
    console.log('FixtureSerializer via model.serialize(): ', model.serialize());
    console.log('RESTSerializer via serializer.serialize(post):', serializer.serialize(model));
  }
});

Вывод журнала консоли будет:

> FixtureSerializer via model.serialize():  Object {title: "This is my post", bodyText: "There are many like it but this one is mine"}
> RESTSerializer via serializer.serialize(post): Object {title: "This is my post", body_text: "There are many like it but this one is mine"}

Вы можете видеть, что RESTSerializer преобразует атрибут bodyText из camelCase в подчеркивание. Живой пример здесь: http://jsbin.com/uduzin/3/edit

Этот ответ может быть немного более актуальным.

Если ваша модель называется "пост", это будет:

const serializer = this.get('store').serializerFor('post');

который дает вам доступ ко всем функциям сериализатора.

serializer.serialize(myRecord);

Ember будет жаловаться, если у вас нет связанной модели для сериализатора.

Другие вопросы по тегам