Angular Factory Filter

mostly for fun, not sure if its really even useful

by Warspawn

HTML

<div ng-app="myApp" ng-controller="myCtrl">
    <ul>
        <li ng-repeat="car in data | repeatFactory:'Car'" ng-click="car.drive()">{{ car.name }}</li>
    </ul>
    <button ng-click="change()">Change Data</button>
</div>

JavaScript

angular.module("myApp", [])
    .filter('spam', function($log) {
        return function(input) {
            for (var x = 0, len = input.length; x < len; x++) {
                $log.log("spam: ", input[x]);
            }
            
            return input;
        };
    })
    .filter("repeatFactory", function($log, $injector) {        
        function F(input, type) {
            if (!(input instanceof Array)) return input;
            
            var arr = [],
                fact = $injector.get(type);
            
            //$log.log("fact", $injector.instantiate(fact, input));
            
            for (var x = 0, len = input.length; x < len; x++) {
                var o = $injector.instantiate(fact, {obj: input[x]});
                arr.push(o);
            }
    
            return arr;
        }
    
        return F;
    })
    .factory("Car", function($log) {
        function Car(obj) {
            $log.log("init car", obj);
    
            angular.copy(obj || {}, this);
            
            this.wheels = 4; // car!
    
            this.drive = function() {
                alert("doors: " + this.doors);
            };
        }
    
        return Car;
    })
    .controller("myCtrl", function($scope) {
        $scope.data = [
            {
                doors: 2,
                name: 'car1'},
            {
                doors: 4,
                name: 'car2'
            }
        ];
        
        $scope.change = function() {
            $scope.data = [{name: 'Diablo', doors: 2}, {name: 'Weasel', doors: 1}, {name: 'Racecar', doors: 0}];
        };
    });