javascript - 数据对象数组装饰器模式的替代方案

标签 javascript angularjs design-patterns

写angular services,我发现了一个我觉得很方便的模式。我认为它符合 decorator 模式的描述。给定一个对象数组:

players = [{
  name: 'Fred',
  counter: 0
},{
  name: 'Fritz',
  counter: 0
},{
  name: 'Frank',
  counter: 0
}];

在将它传递给 View 或 Controller 之前,我通过装饰函数传递它:

players.forEach(decorate);

这个函数为每个对象添加了方便的方法,允许在不需要检索对象索引的情况下就地更改它们:

function decorate(p) {
  p.reset = function() {
    this.counter = 0;
  };
  p.increment = function() {
    this.counter += 1;
  };
  p.bonus = function() {
    this.counter += 10;
  };
  p.penalty = function() {
    this.counter -= 10;
  };
}

这在没有 Angular 的情况下也很有用,但特别是在有 Angular 的情况下,它允许在 ng-repeat 指令中进行简单的事件绑定(bind)。

<div ng-repeat="player in players">
  <div ng-click="player.reset()">reset {{player.name}}</div>
</div>

同时考虑到服务可能被多个 Controller 引用,简化接口(interface)对最后的代码有相当大的影响。

撇开性能问题不谈,您认为这种方法有什么缺点吗?或者您是否在您认为更好的不同方面(例如使用 new)看到了这样的模式?

最佳答案

在你的 Controller 中我会有你需要的不同功能

.service("myService", function(){
    this.players = [...]
    this.reset = function(player){
        player.counter = 0;
    };
});

function MyController($scope, myService){
    $scope.players = myService.players;
    $scope.reset = function(player){
        myService.reset(player);
    }
    OR
    $scope.reset = myService.reset;
}

然后在您的 html 中调用该函数即可

<div ng-repeat="player in players">
  <div ng-click="reset(player)">reset {{player.name}}</div>
</div>

关于javascript - 数据对象数组装饰器模式的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138873/

相关文章:

javascript - 无法从子组件访问状态

javascript - 在我的网站上分享 Facebook

AngularJS 自定义指令,如何绑定(bind)并接受鼠标事件?

javascript - Angular : Binding ngrepeat values to model in AngularJS

只能从类中更新的 C# 公共(public)字段

c# - 每个用户的单例模式 ASP.NET C#

java - 包装责任链功能是否比直接将其放在类中更好?

javascript - 无法以 Angular 形式访问 $scope

javascript - "the remote procedure call failed"- 仅限 IE

javascript - console.log 在 Angular Controller 中不起作用