【问题标题】:How can a component obtain a value synchronously from its parent?组件如何从其父级同步获取值?
【发布时间】:2017-08-18 18:57:54
【问题描述】:

考虑以下使用 Semantic UI 的 Ember 组件:

import Ember from 'ember';

export default Ember.Component.extend({
  classNames: ['ui', 'mini', 'modal'],
  didInsertElement() {
    this.$().modal({
      onApprove: () => {
        let promise = // obtain promise from parent... somehow
        promise.then(() => {
          this.$().modal('hide');
        });
        return false;
      }
    });
  }
});

一旦元素可访问,模式对话框就会被初始化。 onApprove 选项指定当用户在对话框中单击“确定”时要调用的回调。组件的父级提供了一个Ember.RSVP.Promise,解析后会关闭对话框。

这就是问题所在——我如何从父母那里获得承诺?我考虑了以下可能性:

  • 父级可以提供要调用的操作:

    {{modal-dialog action='getPromise'}}
    

    但是,动作不能返回值,所以虽然组件可以调用动作,但它不能使用它来获取承诺。

  • 父级可以将承诺作为绑定属性提供:

    {{modal-dialog promise=promise}}
    

    这种方法的问题是didInsertElement() 无法获得承诺本身,因为组件必须等待promise 属性发生变化。

有没有办法让组件以同步的方式向父级请求值?

【问题讨论】:

  • “获得父母的承诺”是什么意思?
  • @Roamer-1888 父级创建 promise 以响应单击模态的 OK 按钮,然后组件需要访问 promise 以便在 promise 解决时自行关闭。

标签: javascript ember.js promise synchronous


【解决方案1】:

闭包动作将返回值,因此您可以在闭包动作中返回 Promise。

{{modal-dialog getPromise=(action 'getPromise'}}

如果 getPromise 方法返回了承诺,那么你可以像这样let promise = this.get('getPromise')() 得到它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2018-12-08
    • 2016-09-07
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多