行动中的Ember集中错误处理

时间:2017-11-05 00:12:13

标签: ember.js ember-data

在Ember中controller我有一些actions在商店中执行数据事件(创建更新和删除)。

这些请求中的每一个都具有相同的错误处理逻辑,该逻辑重复多次。如果有一种集中这种错误逻辑的方法吗?

  1. 鉴于这种逻辑将被许多路线使用,Ember最适合居住的地方是什么?
  2. 如何保留上下文,以便this仍可用于向DOM发送Toast类型的消息?
  3. 这是我现在拥有的一个例子

    createEntryRecord() {
      // This action is a 'create' button on a modal
      set(this, 'isLoadingModal', true);  // shows loading spinner
      let dbid = this.get('dbidModal');
      let type = this.get('entryModalType');
    
      this.get('store').createRecord('my-store', {
        type,
        dbid
      })
      .save()
      .then((record) => {
        get(this, 'flashMessages').success(`Created`);  // Toast message
      })
      .catch((e) => {
        // Begin of the error handling logic
        let errors = get(e, 'errors');
        if (errors.length) {
          errors.forEach(err => {
            let field = err.source.pointer.split("/").pop();
            get(this, 'flashMessages').danger(`${field}: ${err.detail}`);
          });
        } else {
          let message = get(e, 'message');
          get(this, 'flashMessages').danger(`${message}`);
        }
      })
      .finally(() => {
        set(this, 'isLoadingModal', false);  // stop the loading spinner
        set(this, 'isEntryModalShown', false);
      });
    },
    

1 个答案:

答案 0 :(得分:1)

我建议使用Ember的对象模型Mixins的解决方案 首先,为所有模型创建一个通用的Mixin:

// app/mixins/flashing-model.js
import Mixin from '@ember/object/mixin';
import { inject as service } from '@ember/service';

export default Mixin.create({
    flashMessages: service(), // can be accessed via this.get('flashMessages')
    save(...args) {
        const superSavePromise = this._super(...args);
        superSavePromise.then(() => {
            // your positive logic
        }).catch(e => {
            // your negative logic
        });
        return superSavePromise;
    }
});

然后将其包含在每个模型中。例如:

// app/models/some-model.js
import FlashingModel from '{your-app-name}/mixins/flashing-model';
import DS from 'ember-data'
export default DS.Model.extend(FlashingModel, {
    // ...
});

之后您可以编辑您的控制器:

this.get('store').createRecord('my-store', {
    type,
    dbid
})
.save()
.finally(() => {
    // ...
});

关于你的问题:
 1. Ember Mixins(在app/mixins目录下)可以是托管共同逻辑的好地方  2.实现上述解决方案时,您实际上不需要保留控制器的this上下文,因为flashMessages service被注入到每个模型中。因此,您可以在save方法的上下文中访问该服务,该上下文是模型的this