Ember должен вызывать суперметод из-за ошибки компонента

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

    Assertion Failed: You must call `this._super(...arguments);` when overriding `init` on a framework object. Please update <cahyowhy-mini-blog@component:post-item::ember395> to call `this._super(...arguments);` from `init`.
Error

но в моем компоненте (пост-элемент) я был объявлен своим методом инициализации

import Ember from 'ember';
import BaseController from '../controllers/base-controller';
import Likepost from '../models/likepost';

export default Ember.Component.extend(BaseController, {
  posts: "",
  applyLayout(){
    Ember.$(document).ready(function () {
      let $grid = Ember.$('#post-container').imagesLoaded(function () {
        $grid.masonry({
          itemSelector: '.post-item',
          percentPosition: true,
          columnWidth: '.post-item',
        });
      });
    });
  },
  init(){
    this._super(...arguments);
  },
..... more code

и это мой класс базового контроллера

import Ember from 'ember';

export default Ember.Mixin.create({
  init(){
    //this._super(...arguments); //nek ra dipanggil neng component post item ra keno :(
    let afterRenderExist = this.afterRender !== undefined && typeof this.afterRender === "function";
    if (this.applicationRoute.documentReady && afterRenderExist) {
      Ember.run.schedule('afterRender', this, function () {
        this.afterRender();
      });
    } else if (afterRenderExist) {
      this.applicationRoute.on('onDocumentReady', this, function () {
        this.afterRender();
      });
    }
  },

но когда я пытаюсь раскомментировать этот синтаксис this._super(...arguments); в моем базовом контроллере. ошибка ушла...

может кто решит :(...


person cahyowhy    schedule 27.07.2017    source источник


Ответы (2)


Идея в том, что вам нужно вызвать init, который определен в Ember.Component, если вы этого не сделаете, вы получите ошибку утверждения.

Ember.Component
   basecontroller (this._super is referring to Ember.Component)
      post-item (this._super is referring to basecontroller)   

Просто добраться до родительского класса, который является Ember.Component. нам нужно this._super во всех местах. Всегда вызывать this._super(...arguments) для метода инициализации — это хорошая практика.

person Ember Freak    schedule 28.07.2017

Функция init() всегда существует и определена в Ember (даже если вы ее не писали сами). init() сделает несколько вещей за кулисами, чтобы убедиться, что все в вашем приложении Ember работает правильно.

Расширяя собственную версию init(), важно сохранить ту ключевую функциональность, которую выполняет init(), до того, как вы напишете все, что вам нужно.

Вот почему вы должны позвонить this._super(...arguments);. В противном случае вы, по сути, сломаете Ember, потому что перезапишете некоторые важные функции.

Таким образом, вам действительно нужно this._super(...arguments); в начале вашей функции init(), чтобы все работало правильно. Вот почему комментирование этого дает вам ошибку. Если раскомментировать, то все будет нормально.

person Cameron    schedule 28.07.2017