Замените Ember.ArrayController.create () не будет разрешать отношения ownTo | ember upgrade 3.x - PullRequest
0 голосов
/ 12 ноября 2018

Я нахожусь в процессе обновления и сталкиваюсь с проблемами, потому что ArrayController устарел.

В моем старом маршруте Ember 1.13 я использую

модель / объявление.js

export default DS.Model.extend( {


  id:DS.attr('string'),
  title: DS.attr( 'string' ),
  description: DS.attr( 'string' ),
  published: DS.attr( 'boolean' ),
  publishedAt: DS.attr( 'date' ),

  course: DS.belongsTo( 'course' ),
  author: DS.belongsTo( 'profile', { async: true } ),

  viewed: false,
  isNew: true,

}

сериализатору / announcement.js

import DS from 'ember-data';
import ApplicationSerializer from 'mim/serializers/application';

export default ApplicationSerializer.extend( DS.EmbeddedRecordsMixin, {

  keyForRelationship: function( key ) {

    return key !== 'author' ? key : 'id';
  }
} );

маршруты / announcement.js

 setupController: function( controller, model ) {

    this._super( ...arguments );

     var announcements = Ember.ArrayController.create( {

          model: model,
          sortProperties: [ 'publishedAt' ],
          sortAscending: false
        } );

        controller.set( 'model', announcements );
  },

В контроллере объявления маршрута следует:

* ** 1 022 тысяча двадцать-один * Контроллер / announcement.js
publishedAnnouncements: Ember.computed( 'model.[]', 'model.@each.published', 'model.@each.viewed', function() {

    var published = this.get( 'model' ).filterBy( 'published', true ),
        announcements = Ember.A();

    announcements.pushObjects( published.filterBy( 'viewed', false ) );
    announcements.pushObjects( published.filterBy( 'viewed' ) );

    return announcements;
  } ),

поэтому в шаблоне я запускаю для каждого цикла, чтобы отобразить все объявления, такие как

шаблоны / announcements.hbs

  {{#each publishedAnnouncements as |announcement|}}
        {{announcement.author.firstName}}
      {{/each}} 

После обновления ember 3.5 я изменил их на следующее:

модель / объявление.js

export default DS.Model.extend( {

  id:DS.attr('string'),
  title: DS.attr( 'string' ),
  description: DS.attr( 'string' ),
  published: DS.attr( 'boolean' ),
  publishedAt: DS.attr( 'date' ),

  course: DS.belongsTo( 'course' ),

// удалить асинхронное значение true из профиля

  author: DS.belongsTo( 'profile'),

  viewed: false,
  isNew: true,

}

сериализатору / announcement.js

import DS from 'ember-data';
import ApplicationSerializer from 'mim/serializers/application';

export default ApplicationSerializer.extend( DS.EmbeddedRecordsMixin, {

  keyForRelationship: function( key ) {

    return key !== 'author' ? key : 'id';
  }
} );

* * маршруты тысяча сорок девять / announcement.js

setupController: function( controller, model ) {

    this._super( ...arguments );

     //removed arrayController from here and assigned model

        controller.set( 'model', model );
  },

контроллер / announcement.js

sortProperties: ['publAt: desc'], sortedModel: computed.sort ('model', 'sortProperties'),

publishedAnnouncements: Ember.computed( 'model.[]', 'model.@each.published', 'model.@each.viewed', function() {

   //getting model by local computed property defined above.arrayController sort is doing with above method by sortPropteries 
   var published =this.get('sortedModel').filterBy( 'published', true);
        announcements = Ember.A();

    announcements.pushObjects( published.filterBy( 'viewed', false ) );
    announcements.pushObjects( published.filterBy( 'viewed' ) );

    return announcements;
  } ),

шаблоны / announcements.hbs

  {{#each publishedAnnouncements as |announcement|}}
        {{announcement.author.firstName}}
      {{/each}} 

Тогда announcement.author.firstname не определено в ember 3.5 но если это не отношение к принадлежности, оно будет там (пример announcement.publishedAt)

Понятия не имею, что я пропустил или что я сделал не так.

Я прилагаю здесь скриншот журнала консоли, который я сделал в опубликованной переменной контроллера.

Ember 1.13

enter image description here

Ember 3.5 enter image description here

ваши ответы помогают мне лучше понять проблему. API возвращает пользовательскую версию данных, поэтому для встроенногоRecordsMixin это полезная нагрузка API для курса

{
  "courses": [{
    "created_at": "2016-11-22T09:37:53+00:00",
    "updated_at": "2016-11-22T09:37:53+00:00",
    "students": ["01", "02"],
    "coordinators": ["001", "002"],
    "programme_id": 1,
    "announcements": [{
      "created_at": "2016-11-23T08:27:31+00:00",
      "updated_at": "2016-11-23T08:27:31+00:00",
      "course_id": 099,
      "id": 33,
      "title": "test announcement",
      "description": "please ignore",
      "published_at": "2016-11-23T08:27:31+00:00",
      "published": true
    }, {
      "created_at": "2016-11-25T07:13:18+00:00",
      "updated_at": "2016-11-25T07:13:18+00:00",
      "course_id": 04,
      "id": 22,
      "title": "test before ",
      "description": "test",
      "published_at": "2016-11-25T07:13:18+00:00",
      "published": true
    }]
}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Ember разработан, чтобы быть независимым от сервера. С serialisers вы можете конвертировать все JSON из входящих ответов сервера в соответствии с хранилищем Ember Data. Точно так же вы используете адаптеры для преобразования исходящих запросов сервера к вашему бэкэнду.

Я рекомендую прочитать этот документ:

https://guides.emberjs.com/release/models/customizing-serializers/

Затем выберите из:

0 голосов
/ 12 ноября 2018

С чего начать отладку:

Посмотрите, что возвращает ваш API:

  1. Раскрути свое локальное приложение и API Ember.
  2. Открыть локальный хост: 4200 в Chrome.
  3. Откройте вкладку сети в dev tools.
  4. Обновите страницу, чтобы вызвать сетевой запрос, который, как я полагаю, находится в model() хуке вашего маршрута.
  5. Посмотрите на JSON, возвращенный вашим API. Соответствует ли JSON API ?
  6. Откройте вкладку данных в Ember Inspector .
  7. После того как запрос поступил, заполнил ли вас автор, которого вы ожидаете увидеть?
  8. Если да, у него есть firstName или он не определен?

Если все положительные, то мы, вероятно, можем исключить проблемы с запросом, API и сериализаторами.

Просмотр этого сериализатора:

// app/serializers/announcments.js

import DS from 'ember-data';
import ApplicationSerializer from 'mim/serializers/application';

export default ApplicationSerializer.extend( DS.EmbeddedRecordsMixin, {
  keyForRelationship: function( key ) {
    return key !== 'author' ? key : 'id';
  }
} );

Миксин EmbeddedRecordsMixin подразумевает, что ваш API возвращает внедренные данные, что довольно редко встречается для ответов, совместимых с JSON API. Это единственный сериализатор, который вам понадобится, если все соответствует этой спецификации :

// app/serializers/application.js

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

export default JSONAPISerializer.extend({});

Данные, поступающие из вашего API, должны выглядеть следующим образом:

{
  "data": [{
    "type": "announcement",
    "id": "1",
    "attributes": {
      "message": "...",
    },
    "relationships": {
      "author": {
        "data": { "type": "profile", "id": "9" }
      },
    }
  }],
  "included": [{
    "type": "profile",
    "id": "9",
    "attributes": {
      "firstName": "John",
      "lastName": "Johnson"
    },
  }]
}
...