Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数据对象数组上装饰器模式的替代方案 写作角度服务,我发现了一个我认为非常方便的模式。我认为它符合装饰图案的描述。给定一组对象: players = [{ name: 'Fred', counter: 0 },{ name: 'Fritz', counter: 0 },{ name: 'Frank', counter: 0 }];_Javascript_Angularjs_Design Patterns - Fatal编程技术网

Javascript 数据对象数组上装饰器模式的替代方案 写作角度服务,我发现了一个我认为非常方便的模式。我认为它符合装饰图案的描述。给定一组对象: players = [{ name: 'Fred', counter: 0 },{ name: 'Fritz', counter: 0 },{ name: 'Frank', counter: 0 }];

Javascript 数据对象数组上装饰器模式的替代方案 写作角度服务,我发现了一个我认为非常方便的模式。我认为它符合装饰图案的描述。给定一组对象: players = [{ name: 'Fred', counter: 0 },{ name: 'Fritz', counter: 0 },{ name: 'Frank', counter: 0 }];,javascript,angularjs,design-patterns,Javascript,Angularjs,Design Patterns,在将其传递给视图或控制器之前,我将其传递给装饰函数: players.forEach(decorate); 此函数为每个对象添加方便的方法,允许在不需要检索对象索引的情况下就地更改它们: function decorate(p) { p.reset = function() { this.counter = 0; }; p.increment = function() { this.counter += 1; }; p.bonus = function()

在将其传递给视图或控制器之前,我将其传递给装饰函数:

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
指令中进行简单的事件绑定

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

重置{{player.name}
考虑到服务可能会被多个控制器引用,简化接口最终会对代码产生相当大的影响


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

在你的控制器中,我会有你需要的不同功能

.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>

重置{{player.name}

您可以深入研究这个概念。您可以通过使用原型来提高性能,即
players=players.map(createInstance)
看起来像装饰器模式是的,它看起来确实类似于装饰器或混合。我将花一些时间研究该术语并在CaseInterest中编辑该问题,但是如果模型存在于服务中,您希望在同一服务中定义这些函数以进行封装,在这种情况下,每次您想在控制器中使用它们中的一个时,您都必须将它们重新分配给一个范围变量。您可以将服务函数直接分配给同一个范围,或者将范围调用给服务。两种方式都可以。请参阅我的编辑是的,但这正是我想要避免的重复类型。嗯,您必须以某种方式将服务信息附加到您需要的范围。也许$scope.myService=myService,那么在您的dome中您可以引用players.myService和myService.reset(player)?