2014-02-28 112 views
0

相關問題:AngularJS Decorator without object.definePropertyAngularJS裝飾IE7

它似乎適用裝飾的標準方法是用object.defineProperty但畢竟是not supported in 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的方法類似this answer顯示了正確的方式。

回答

0

我這個

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

走到這是最簡單的解決方案,它在IE7中工作。打電話給constructorprototype__proto__沒有或沒有polyfills只是導致無盡的麻煩。