所以我有一个注册事件监听器的原型对象。侦听器接收一个对象和一个指示发出事件源的字符串。
该对象将是一些函数调用的参数(_convertToX(someObj)
,_convertToY(someObj)
,...)
现在我要做的是动态调用我的convert
函数(因为将来可能会添加更多函数),每个函数只需要一个参数(someObj
)。
// constructor
const MyFactory = function () {
// ...
$rootScope.$on('someObj:changed', (event, someObj, source) => {
// TODO: call converters dynamically, but not the one which converts back to the source
// source can be 'X', 'Y' or 'Z'
});
}
MyFactory.prototype._convertToX = function (someObj) {
// TODO: convert to X and emit
};
MyFactory.prototype._convertToY = function (someObj) {
// TODO: convert to Y and emit
};
MyFactory.prototype._convertToZ = function (someObj) {
// TODO: convert to Z and emit
};
关于SO的类似问题可能已有答案,但我不知道如何找到合适的搜索字词......
我的方法是创建一个包含所有converter
函数的数组,并从数组中调用它们。我看到的问题是如何确保我不会调用转换回source
的转换器?
/**
* Hold references to all converters.
* @type {Array<function>}
*/
this._converters = [
this._convertToX,
this._convertToY,
this._convertToZ
];
// assume source is 'Z'
$rootScope.$on('someObj:changed', (event, someObj, source) => {
// how to call each function in this._converters with someObj as argument
// except this._convertToZ(someObj) ?
});
这是一种干净的方法吗?怎么做?
或者是否有更简洁的方法来实现它?
答案 0 :(得分:3)
您可以使用Bracket notation根据字符串文字
访问该功能const MyFactory = function () {
//Store the reference to a variable
const self = this;
$rootScope.$on('someObj:changed', (event, someObj, source) => {
//Use Bracket notation to access the function
self["_convertTo" + source](someObj)
});
}
根据评论,除了source之外,我建议你创建一个sources
列表,然后在事件处理程序中获取除source之外的所有方法并执行它们。
const MyFactory = function () {
//Store the reference to a variable
const self = this;
const sources = ['X', 'Y', 'Z'];
$rootScope.$on('someObj:changed', (event, someObj, source) => {
//Use Bracket notation to access the function
var expectSource = sources.filter(x => x !== source);
expectSource.forEach(x => self["_convertTo" + x](someObj))
});
}