【问题标题】:Ember Route Promise - Is this doing what I need?Ember Route Promise - 这是我需要的吗?
【发布时间】:2015-09-09 15:58:14
【问题描述】:

我有一条返回 3 个模型的路线。在路由返回模型之前,需要解析每个模型。我已尝试使用以下模式进行此操作(为了清晰起见,部分代码已编辑)

export default Ember.Route.extend({
   model: function(params, transition) {

    var _this = this;

    //Set up a hash to pass to RSVP. Ensures that permissions are returned BEFORE outlet and account query
    var getPermissions = {

        permission : this.store.query('permission',query).then(function(permissions){

            var outlets = _this.store.findByIds('outlet', permissions.map REDACTED);

            var accounts = _this.store.findByIds('account', permissions.map REDACTED);

            var result = {permissions, accounts, outlets};

            return result;

        })


    };          

    return Ember.RSVP.hash(getPermissions); 
 }

});

到目前为止,我的所有模型都已正确填充到商店中,但我在访问控制器中的帐户和网点模型中的属性时遇到问题,但 UI 可以毫无问题地呈现这些项目。

我猜这个promise没有做我想做的事,就是保证所有模型在模型返回之前都是可用的。

任何帮助将不胜感激!

【问题讨论】:

  • 你能分享你有问题的代码吗?你有什么具体问题?正在寻找什么模板代码?

标签: ember.js promise


【解决方案1】:

到目前为止,这可以使我的所有模型都正确填充到 商店,但我在访问帐户中的属性时遇到问题 和我的控制器中的出口模型,但 UI 呈现这些项目 没有问题。

accountsoutlets 存在问题,因为当 this.store.query('permission', query) 解决时,Ember.RSVP.hash 也解决了。

确保在解决permissions 后将所有承诺传递给Ember.RSVP.hash

export default Ember.Route.extend({
    model(params, transition) {   

        return new Promise((resolve) => {
            this.store.query('permission', query).then((permissions) => {
                let outlets  = this.store.findByIds('outlet', permissions.map REDACTED),
                    accounts = this.store.findByIds('account', permissions.map REDACTED);

                resolve(Ember.RSVP.hash({
                    outlets:     outlets,
                    accounts:    accounts,
                    permissions: permissions
                }));
            });
        });
    }
});

【讨论】:

  • 感谢您抽出宝贵时间提供帮助,非常有用,非常感谢。
  • 如果您找到解决方案,请选择并接受答案。
  • 抱歉,这里有点暗 - 当我点击“回答”按钮时,我只能选择添加文本。如何表明其中一个响应是答案?
  • 下面的箭头可以对答案投赞成票或反对票,在帖子分数下方,答案左侧有tick 按钮表示接受答案。您单击此勾选按钮将答案标记为已接受。完成后它会变成绿色。您也可以撤消该操作。访问 SO 帮助中心并浏览以查看并指导如何接受答案 - stackoverflow.com/tour
【解决方案2】:

正如所写,您的 model 承诺将解析为类似 { permissions: Array, accounts: Promise, outlets: Promise } 的值

您想消除嵌套的 promise 并最终得到如下值:{ permissions: Array, accounts: Array, outlets: Array }

为此,请将调用移至内部的hash

export default Ember.Route.extend({
   model: function(params, transition) {

    var _this = this;

    //Set up a hash to pass to RSVP. Ensures that permissions are returned BEFORE outlet and account query
    return this.store.query('permission',query).then(function(permissions){
        var outlets = _this.store.findByIds('outlet', permissions.map REDACTED);
        var accounts = _this.store.findByIds('account', permissions.map REDACTED);
        return Ember.RSVP.hash({permissions, accounts, outlets}); 
    });     

 }

});

等价于 ES6 语法:

export default Ember.Route.extend({
  model: function(params, transition) {
    //Set up a hash to pass to RSVP. Ensures that permissions are returned BEFORE outlet and account query
    return this.store.query('permission',query).then(permissions => Ember.RSVP.hash({
        permissions,
        outlets: this.store.findByIds('outlet', permissions.map REDACTED),
        accounts: this.store.findByIds('account', permissions.map REDACTED)
    }));
  }
});

【讨论】:

  • 非常感谢(再次!)。这很有帮助。
猜你喜欢
  • 2017-04-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2020-05-30
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多