2017-03-26 17 views
0

イントロ:Group(s)の配列が含まれ、すべてのグループがUser(s)の配列が含ま Itemオブジェクト:活字体:フォーカス喪失時デコレータ

私は、次のような構造を持っています。 addUserremoveUseraddGroupremoveGroupaddUnitremoveUnitItemには、以下のAPIがあります。 これらのアクションのそれぞれは、(特定のグループの)各ユーザーのrankプロパティの新しい計算をトリガします。

APIの各アクションの最後に、メソッドcalcRankが明示的に(OnExitデコレータのように)呼び出されることなくトリガーされる方法を探しています。

答えて

1

The Advice Patternは、JavaScriptなどのような動的言語では本当に簡単です:

function before(behavior) { 
    return method => function beforeHandler(...args) { 
    behavior.apply(this, args); 
    return method.apply(this, args); 
    }; 
} 

function after(behavior) { 
    return method => function afterHandler(...args) { 
    const result = method.apply(this, args); 
    behavior.apply(this, [args, result]); 
    return result; 
    }; 
} 

const id = _ => _; 

function withAdvice({before: beforeBehavior = id, after: afterBehavior = id, skip: [] }) { 
    return Class => Object.keys(Class.prototype).forEach(methodName => { 
    if (!skip.contains(methodName)) { 
     const method = Class.prototype[methodName]; 
     const afterDecorator = after(afterBehavior); 
     const beforeDecorator = before(beforeBehavior); 
     Class.prototype[methodName] = afterDecorator(beforeDecorator(method)); 
    } 
    }); 
} 


@withAdvice({ 
    after() { 
    this.calcRank(); 
    }, 
    skip: ['calcRank'] 
}) 
class Item { 
    addUser() {} 
    removeUser() {} 
    addGroup() {} 
    removeGroup() {} 
    addUnit() {} 
    removeUnit() {} 
    calcRank() {} 
} 
+0

は素晴らしい見えます!私が行って 'TypeScript'で試してみると、セットアップは違うでしょうか?この行について説明してください: 'const id = _ => _;'ありがとう。 – user1692261