ember必须从组件错误中调用super方法

时间:2017-07-27 17:49:11

标签: javascript ember.js handlebars.js ember-components ember-controllers

我只是用我的自定义mixins类扩展我的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

这是我的basecontroller类

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);时。错误消失了......

任何人都可以解决这个问题:( ...

2 个答案:

答案 0 :(得分:1)

函数init()始终存在并在Ember中定义(即使您没有自己编写)。 init()将在幕后做几件事,以确保Ember应用程序中的所有内容都正常工作。

通过扩展自己的init()版本,在编写需要编写的内容之前,保留init()所执行的关键功能非常重要。

这就是你应该拨打this._super(...arguments);的原因。否则你基本上会破坏Ember,因为你要覆盖一些重要的功能。

基本上,在this._super(...arguments);函数的开头,实际上需要init()才能使一切正常运行。这就是为什么评论它会给你一个错误。如果你取消注释,那么一切都会好的。

答案 1 :(得分:1)

想法是你需要调用在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。始终为init方法调用this._super(...arguments)是良好实践。