在Ember中controller
我有一些actions
在商店中执行数据事件(创建更新和删除)。
这些请求中的每一个都具有相同的错误处理逻辑,该逻辑重复多次。如果有一种集中这种错误逻辑的方法吗?
this
仍可用于向DOM发送Toast类型的消息?这是我现在拥有的一个例子
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);
});
},
答案 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
。