簡體   English   中英

AngularJS裝飾器IE7

[英]AngularJS Decorators IE7

相關問題: 沒有object.defineProperty的AngularJS裝飾器

似乎應用裝飾器的標准方法是使用object.defineProperty但是IE7不支持這種方法。

有一些object.defineProperty選項用於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方法的正確方法,如答案所示。

我去了

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

這是最簡單的解決方案,並且可以在IE7中使用。 不帶或不帶polyfill的constructorprototype__proto__調用只會導致無盡的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM