AngularJS issue 1404

https://github.com/angular/angular.js/issues/1404

HTML

<script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<script src="http://code.angularjs.org/1.0.1/angular-1.0.1.min.js"></script>
<div ng-app="myApp">
  <div ng-controller="MyController">
    <form id="leForm" name="form">
      <div data-ng-repeat="name in names">
        <input 
          type="text" 
          id="field{{ name }}" 
          name="{{ name }}" 
          data-ng-model="field.data" 
          value="This is field {{name}}"
          />
      </div>
    </form>
    
      
    <hr>
    <h3>Expected $scope.form</h3>
    <pre>{
  "foo": {}, 
  "bar": {}, 
  "baz": {}
}    </pre>
    <hr>
        
        
    <h3>Actual</h3>
    <pre>{{ form | json }}</pre>
  </div>
</div>

JavaScript

var app = angular.module('myApp', []);
//
app.controller('MyController', [ '$scope' , function($scope) {
    $scope.model = {};
    $scope.names = ['foo','bar','baz'];
}]);
   
// Workaround for bug #1404
// https://github.com/angular/angular.js/issues/1404
// Source: http://plnkr.co/edit/hSMzWC?p=preview
app.config(['$provide', function($provide) {
    $provide.decorator('ngModelDirective', ['$delegate', function($delegate) {
        var ngModel = $delegate[0], controller = ngModel.controller;
        ngModel.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
            var $interpolate = $injector.get('$interpolate');
            attrs.$set('name', $interpolate(attrs.name || '')(scope));
            $injector.invoke(controller, this, {
                '$scope': scope,
                '$element': element,
                '$attrs': attrs
            });
        }];
        return $delegate;
    }]);
    $provide.decorator('formDirective', ['$delegate', function($delegate) {
        var form = $delegate[0], controller = form.controller;
        form.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
            var $interpolate = $injector.get('$interpolate');
            attrs.$set('name', $interpolate(attrs.name || attrs.ngForm || '')(scope));
            $injector.invoke(controller, this, {
                '$scope': scope,
                '$element': element,
                '$attrs': attrs
            });
        }];
        return $delegate;
    }]);
}]);