В Ember с закрытием действия, которые вы можете передать функцию, например:EmberJS 2.7 - с помощью действия закрытия для вызова функции против вызова этой функции в качестве действия
<div class="dropzone text-center" {{action (action openFilePicker)}}>
<!-- this calls a function (no quotes!) -->
</div>
вместо вызова действие, как показано ниже.
<div class="dropzone text-center" {{action (action 'openFilePicker')}}>
<!-- this calls an action (quotes!) -->
</div>
В (1) код подкладки этот компонент выглядит следующим образом:
openFilePicker: function() {
let child = this.$('div:first-child');
child.removeClass('is-dragging');
child.html('<h2>Upload GPX Route</h2><div class="dropzone-body-text"><h5>Drag and Drop here</h5>- or -<h5>click anywhere here</h5></div>');
filepicker.pick({
container: 'modal',
maxSize: (5 * 1024 * 1024),
services: ['COMPUTER']
});
}
Это использует JQuery, чтобы удалить некоторые элементы из DOM, а затем вызывает другую функцию (filepicker. pick), который находится во внешнем загруженном JS-файле.
В (2) тот же код находится внутри действия:
actions: {
openFilePicker: function() {
let child = this.$('div:first-child');
child.removeClass('is-dragging');
child.html('<h2>Upload GPX Route</h2><div class="dropzone-body-text"><h5>Drag and Drop here</h5>- or -<h5>click anywhere here</h5></div>');
filepicker.pick({
container: 'modal',
maxSize: (5 * 1024 * 1024),
services: ['COMPUTER']
});
}
}
Каковы плюсы и минусы это делать? Я понимаю, что (1) не рекомендуется делать это, но, безусловно, (1) упрощает доступ к другому коду в component
(например, свойства компонента). Как обычно, документация Ember
, похоже, не проливает свет на это (не то, что я могу найти в любом случае). Все, что я могу найти, это this blog post, который заставляет отказаться от вызова произвольных функций (в противном случае почему у вас есть действия в первую очередь?)
Так что, хотя этот вопрос может привести к мнению, это не то, что я хочу. Я хочу понять, что такое разница между этими двумя подходами: SCOPING
? Например, когда вы находитесь внутри функции INSIDE для действия, каково различие в области с точки зрения времени выполнения JS? Например, «это» одно и то же в обоих случаях?
Почему проще получить доступ к другому коду компонента? Ember свяжет «это» за ваши действия с вашим компонентом. – Lux
Что делать, если внутри функции внутри компонента вы хотите вызвать другую функцию (скажем, в динамически загруженном внешнем файле, который вы загрузили только для использования в этом компоненте, - общий сценарий для надстроек). «это» больше не связано, не так ли? Вам нужно будет сделать myComponent = это внутри действия, прежде чем называть эту вложенную функцию (я думаю!) – rmcsharry
@ Lux Оказывается, это не облегчает :) Это было мое недоразумение. – rmcsharry