أنغولارجس الديكور دون كائن.تعريفالممتلكات
-
24-12-2019 - |
سؤال
كيف يمكنني استخدام الديكور دون الوصول إلى الكائن.ديفينيبروبيرتي?
أنا أبحث في الحشوات المتاحة:
ولكن في حالة عدم اجتياز الاختبار, هل هناك طريقة أخرى كان من المفترض أن يعمل بها المصممون?
أنا باستخدام الديكور ل on منظار الجذور.
أنا باستخدام الزاوي 1.08.أحتاج التوافق مع إي 7.
تحديث
لقد جربت بعض الطرق التي يبدو أنها تعمل ولكني لا أعرف الفرق بينهما: بلونكر
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('MainCtrl', function($rootScope, $scope) {
console.log($rootScope); //reveals `a` property
console.log($rootScope.constructor.prototype); //=> {b:2, c:3}
console.log($rootScope.a); //=> 1
console.log($rootScope.b); //=> 2
console.log($rootScope.c); //=> 3
$scope.name = 'World';
});
يعطيكم الصّحة.
المحلول
حسنا ، حل مكافئ ل بيس من التعليمات البرمجية التي شاركتها هو:
var proto = Object.getPrototypeOf(Object.getPrototypeOf($delegate));
proto['$onRootScope'] = function (name, listener) {
var unsubscribe = $delegate.$on(name, listener);
this.$on('$destroy', unsubscribe);
};
في الكود الأصلي هذا السطر $delegate.constructor.prototype
هو الحصول على الوصول إلى النموذج الأولي للمندوب.
بعد ذلك ، بمجرد الوصول إليها ، يمكنك ببساطة تحديد وظيفة جديدة فيها.لا تحتاج إلى استخدام defineProperty
.التحذير الوحيد هو أنه باستخدام defineProperty
يمكنك تكوين أن الأسلوب غير قابل للعد (يجب أن لا تظهر في ل-كل الحلقات).بهذه الطريقة الأخرى ، ستظهر الطريقة المضافة في كل حلقة.قد لا يكون مشكلة بالنسبة لك على الرغم من.
لقد خلقت جسفيدل لهذا.
يمكنك استخدام بوليفيل جون ريسيج ل getObjectPrototypeOf
إذا كانت الوظيفة غير متوفرة لمتصفحك الحالي:
if ( typeof Object.getPrototypeOf !== "function" ) { if ( typeof "test".__proto__ === "object" ) { Object.getPrototypeOf = function(object){ return object.__proto__; }; } else { Object.getPrototypeOf = function(object){ // May break if the constructor has been tampered with return object.constructor.prototype; }; } }