0

関連する質問: object.defineProperty を使用しない AngularJS デコレーター

デコレータを適用する標準的な方法は with のようですobject.defineProperty、IE7 ではサポートされていません

には、いくつかのポリフィル オプションがありますobject.defineProperty

また、いくつかの興味深い結果が得られたplunkrでいくつかの実験を行いました。

<div  ng-controller="ParentCtrl">
  <div ng-controller="ChildCtrl"></div>
</div>
<div ng-controller="SiblingCtrl"></div>

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

app.config(['$provide', function($provide){
  $provide.decorator('$rootScope', ['$delegate', function($delegate){
    $delegate.a = 1;
    $delegate.constructor.prototype.b = 2;
    Object.defineProperty($delegate.constructor.prototype, 'c', {
      value: 3
    });
    return $delegate;
  }]);
}]);

app.controller('ParentCtrl', function($rootScope, $scope) {
  console.info('ParentCtrl', $rootScope.a); // 1
  console.info('ParentCtrl', $rootScope.b); // 2
  console.info('ParentCtrl', $rootScope.c); // 3
  console.info('ParentCtrl', $rootScope.constructor.prototype.a); // undefined
  console.info('ParentCtrl', $rootScope.constructor.prototype.b); // 2
  console.info('ParentCtrl', $rootScope.constructor.prototype.c); // 3
  $rootScope.a = 'a';
  $rootScope.b = 'b';
  $rootScope.c = 'c';
});

app.controller('ChildCtrl', function($rootScope, $scope) {
  console.info('ChildCtrl', $rootScope.a); // 1
  console.info('ChildCtrl', $rootScope.b); // b
  console.info('ChildCtrl', $rootScope.c); // 3
  console.info('ChildCtrl', $rootScope.constructor.prototype.a); // undefined
  console.info('ChildCtrl', $rootScope.constructor.prototype.b); // 2
  console.info('ChildCtrl', $rootScope.constructor.prototype.c); // 3
});

app.controller('SiblingCtrl', function($rootScope, $scope) {
  console.info('SiblingCtrl', $rootScope.a); // a
  console.info('SiblingCtrl', $rootScope.b); // b
  console.info('SiblingCtrl', $rootScope.c); // 3
  console.info('SiblingCtrl', $rootScope.constructor.prototype.a); // undefined
  console.info('SiblingCtrl', $rootScope.constructor.prototype.b); // 2
  console.info('SiblingCtrl', $rootScope.constructor.prototype.c); // 3
});

私の質問は次のとおりです。この回答が示すように、rootScope にメソッドを提供する正しい方法はどれですか。

4

1 に答える 1

0

私はこれで行きました

app.config(['$provide', function($provide){
  $provide.decorator('$rootScope', ['$delegate', function($delegate){
    $delegate.func = function() {
       ...
    };
    return $delegate;
  }]);
}]);

これは最も簡単な解決策であり、IE7 で動作します。ポリフィルを呼び出す、constructorまたはポリフィルを使用しない、または使用しないと、無限の問題が発生しましたprototype__proto__

于 2014-03-05T02:08:12.977 に答える