Релиз EMBER DATA 2.3 и 2.4 BETA


Статья от 12 января 2016 года.

Сегодня состоялся релиз Ember Data 2.3. Это "минорная" версия Ember Data. Данный релиз является результатом совместной работы более 32 прямых исполнителей и 196 коммиттеров.

Также сегодня появилась Ember Data 2.4 beta 1. Эта версия станет стабильной через шесть недель.

Изменения в Ember Data 2.3

Ember Data 2.3 теперь является полноценным дополнением для Ember CLI. В предыдущих версиях пользователям приходилось включать пакет ember-data в файлы проекта package.json и bower.json. Это путало пользователей, так как обновление пакета ember-data в package.json не затрагивало пакет ember-data в bower.json.

Чтобы в проектах Ember CLI обновить Ember Data до версии 2.3, сделайте следующее:

  1. Удалите пакет ember-data из файла bower.json.
  2. Обновите пакет ember-cli-shims до версии 0.1.0.
   ...
   "dependencies": {
     "handlebars": "2.0.0",
     "ember": "~2.2.0",
-    "ember-cli-shims": "0.0.6",
+    "ember-cli-shims": "0.1.0",
     "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
-    "ember-data": "~1.13.12",
     "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.5",
     ...

Затем в файле package.json обновите пакет ember-data до версии ^2.3.0.

   ...
   "devDependencies": {
     ...
     "ember-cli-sri": "^2.0.0",
     "ember-cli-uglify": "^1.2.0",
-    "ember-data": "^2.2.1",
+    "ember-data": "^2.3.0",
     "ember-disable-proxy-controllers": "^1.0.1",
     ...

Отдельное спасибо @fivetanley за его героические усилия по преобразованию сборки Ember Data в дополнение Ember CLI.

Импорт модулей

Дополнение Ember Data дает пользователям возможность импортировать модули напрямую в приложение, вместо того чтобы получать доступ к модулям высокоуровневого пространства имен DS.

Следующие пути модулей станут частью публичного API и будут поддерживаться как минимум до релиза Ember Data 3.0

// DS.Model
import Model from 'ember-data/model';

// DS.RESTSerializer
import RESTSerializer from 'ember-data/serializers/rest';

// DS.JSONSerializer
import JSONSerializer from 'ember-data/serializers/json';

// DS.JSONAPISerializer
import JSONAPISerializer from 'ember-data/serializers/json-api';

// DS.JSONAPIAdapter
import JSONAPIAdapter from 'ember-data/adapters/json-api';

// DS.RESTAdapter
import RESTAdapter from 'ember-data/adapters/rest';

// DS.Adapter
import Adapter from 'ember-data/adapter';

// DS.Store
import Store from 'ember-data/store';

// DS.Transform
import Transform from 'ember-data/transform';

// DS.attr
import attr from 'ember-data/attr';

// DS.hasMany or DS.belongsTo
import { hasMany, belongsTo } from 'ember-data/relationships';

Модули, которые не станут частью публичного API, будут размещены в папке ember-data/-private. Не импортируйте данные модули в приложения или тесты, так как они могут быть изменены или удалены без предупреждения.

Отдельное спасибо @rwjblue за реализацию этого API.

Важные правки

PR #4025 ИСПОЛЬЗОВАНИЕ KEYFORRELATIONSHIP ДЛЯ BELONGSTO И HASMANY

EmbeddedRecordsMixin теперь использует keyForRelationship, чтобы генерировать сериализованный ключ для встроенных связей. За эту правку стоит поблагодарить @GCorbel.

PR #3866 РАЗРЕШЕНИЕ STORE.PUSH ПРИНИМАТЬ { DATA: NULL }

JSONAPISerializer теперь корректно принимает {"data": null} как допустимый ответ, а не выдает бесполезное сообщение об ошибке. Спасибо @mitchlloyd за отчет об ошибке.

Полный список изменений можно увидеть в Ember Data 2.3.0 CHANGELOG.

EMBER DATA 2.4 BETA

Сегодня состоялся релиз Ember Data 2.4 beta 1. Эта версия станет стабильной через шесть недель. В этом бета-цикле добавлена одна новая функция.

Дружелюбные сообщения об ошибках

@nikz реализовал RFC 101, который предоставляет больше информации в сообщениях об ошибках для RESTAdapter и JSONAPIAdapter в Ember Data. Посмотреть обсуждение можно здесь.

Более подробную информацию об изменениях в версии 2.4 можно найти в Ember Data 2.4.0-beta.1 CHANGELOG.

Будущие функции

В ветке Ember Data canary недавно появились две новые функции, которые многие ждали. Но прежде чем их включат в ветку beta, команда хотела бы получить обратную связь от сообщества по поводу их реализации. Эти функции доступны только с использованием флагов и на ветке master (иногда ее называют "canary"). Для тестирования функций измените версию Ember Data в файле package.json на emberjs/data#master и добавьте соответствующие флаги к объекту FEATURES в EmberENV в файле config/environment.js.

config/environment.js

var ENV = {
  EmberENV: {
    FEATURES: {
      'ds-finder-include': true,
      'ds-references': true
    }
  }
};

Для получения дополнительной информации вы можете посмотреть раздел руководства по Флагам функций.

ds-finder-include

Функция ds-finder-include позволяет указывать параметр запроса include с помощью методов store.findRecord() и store.findAll(). Поведение данной функции описано в RFC 99. Функция позволит проще определять, когда backends должны вернуть sideloaded связи. Спасибо @HeroicEric за реализацию данной функции.

// GET /articles/1?include=comments

var article = this.store.findRecord('article', 1, { include: 'comments' });
// GET /articles?include=comments

var article = this.store.findAll('article', { include: 'comments' });

ds-references

Функция ds-references реализует ссылочный API, который описан в RFC 57. Ссылки являются низкоуровневым API для выполнения метаопераций с записями и отношениями has-many и belongs-to. Например:

  • получить в синхронном режиме текущие локальные данные без вызова fetch или Promise;
  • уведомить хранилище, что для данной записи вызван fetch, и вернуть Promise для результата;
  • аналогично, уведомить запись, что началась выборка его отношений, и вернуть Promise для результата;
  • получить с сервера метаданные о записях или связях.

Рассмотрим следующую модель post:

// app/models/post.js
import Model from 'ember-data/model';
import { belongsTo, hasMany } from 'ember-data/relationships';

export default Model.extend({
  comments: hasMany(),
  author: belongsTo()
});

Ссылочный API позволяет взаимодействовать с отношениями:

var post = store.peekRecord('post', 1);

// check if the author is already loaded, without triggering a request
if (post.belongsTo('author').value() !== null) {
  console.log(post.get("author.name"));
} else {
  // load the author
  post.belongsTo('author').load();
}

// reload the author
post.belongsTo('author').reload();

// check if there are comments, without triggering a request
if (post.hasMany('comments').value() !== null) {
  var ids = post.hasMany('comments').ids();

  var meta = post.hasMany('comments').meta();
  console.log(`${ids.length} comments out of ${meta.total}`);
} else {
  post.hasMany('comments').load();
}

// reload comments
post.hasMany('comments').reload();

Отдельное спасибо @pangratz за реализацию данной функции.

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.