AngularJS Decorate

decorate factory

by Nadeesh Peiris

HTML

<script src="https://code.angularjs.org/1.4.7/angular.min.js"></script>
<div ng-controller="HelloCtrl">
    <p>{{text1}}</p>
    <p>{{text2}}</p>
</div>

JavaScript

var app = angular.module('myApp', []);

app.factory('decoratorService', function(){  
  return {}               
});

app.factory('testFactory', function(decoratorService){
  
  Player = function(){
  	this.type = "Taekwondo";
		this.level = 1;
    this.country = "Sri Lanka";
  }
  
  changeType = function(){
  	return "Wrestling";
  }
  
  Player.prototype.changeCountry = function(){
  	this.country = "Australia";
  }
  
  Player.prototype.upgrade = function(){
  	if(typeof decoratorService.postConstructor === 'function'){
    	this.level = decoratorService.postConstructor(this.level);
    }
  }
      
  getPlayer = function(){
  	var p = new Player();
    //console.log(p);
    p.upgrade();
    p.type = changeType(); // this.changeType() set type to "MMA"
    p.changeCountry();
		return p;
	}
  
	return {
    getPlayer: getPlayer,
    Player: Player
	}               
});

app.controller('HelloCtrl', function($scope, testFactory){
		var p1 = testFactory.getPlayer();
    
    var p2 = new testFactory.Player();
    //p2.changeCountry();
    
    $scope.text1 = "Level "+p1.level+" "+p1.type+" player from "+p1.country;
    $scope.text2 = "Level "+p2.level+" "+p2.type+" player from "+p2.country;
});

app.decorator('decoratorService', function($delegate){

    $delegate.postConstructor = function(level) {
			return level+1;
    }

    return $delegate;
});

app.decorator('testFactory', function($delegate){
               
    $delegate.changeType = function(){
  		return "MMA"; 	
  	}
    
    /*$delegate.Player.prototype.changeCountry = function(){
  		this.country = "Korea";
  	}*/
    
    $delegate.Player = function(){
      this.type = "Taekwondo";
      this.level = 3;
      this.country = "USA";
    }

    return $delegate;
});