2016-08-26 7 views
0

Я хочу понять, как вызывается функция в плагине.Как вызывается функция emberjs?

Вот фрагмент кода из discourse-adplugin

export default Ember.Component.extend({ 
    ... 
    _initGoogleDFP: function() { 
    var self = this; 
    loadGoogle(this.siteSettings).then(function() { 
     ... 
    }); 
    }.on('didInsertElement'), 
    ... 
}); 

Там нет упоминания о том, что функция _initGoogleDFP, очевидно, ссылаясь на кого-то, но это как-то вызывает из кишок emberjs.

Каковы принципы инициализации компонентов emberjs? Как _initGoogleDFP ссылается на emberjs?

ответ

2

Ember.on функция (или Function.prototype.on) возвращает специальную функцию с некоторыми деталями реализации Ember:

export default Ember.Component.extend({ 
    ... 
    _initGoogleDFP: <some-special-function-object>, 
    ... 
}); 

Ember перебирает ключи в определении вашего класса, глядя на эти специальные объекты, и в конечном итоге вызывает Ember.addListener('didInsertElement', yourFunction).

Следует избегать использования .on. Это сбивает с толку. Если у вас есть два .on('didInsertElement'), в каком порядке их вызывают? Кто знает.

Предпочтительный способ написать код, чтобы переопределить didInsertElement:

export default Ember.Component.extend({ 
    ... 
    didInsertElement() { 
    this._super(...arguments); 

    var self = this; 
    loadGoogle(this.siteSettings).then(function() { 
     ... 
    }); 
    } 
    ... 
}); 

Если вам нужно вызвать _initGoogleDFP из других мест, делают его функцию, и вы можете вызвать его из didInsertElement:

export default Ember.Component.extend({ 
    ... 
    _initGoogleDFP: function() { 
    var self = this; 
    loadGoogle(this.siteSettings).then(function() { 
     ... 
    }); 
    }, 

    didInsertElement() { 
    this._super(...arguments); 
    this._initGoogleDFP(); 
    } 
    ... 
}); 
+0

Этот код из плагина discourse, поэтому они подключаются к событию didInsertElement, компонент будет загружать асинхронно в среду дискурса. – megas

Смежные вопросы