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}];
};
});