Могу ли я дать всем контроллерам новый метод, влияющий на собственную область действия каждого контроллера?

В общих чертах

Могу ли я сделать так, чтобы у всех контроллеров был наблюдатель, предоставляющий переменную локальной области видимости или метод, влияющий только на локальную область видимости? Вроде черты.

Более конкретно

По умолчанию я хочу, чтобы каждый новый контроллер имел свойство status, доступное и установленное в его собственной области, и наблюдатель, который запрашивает службу для установки статуса. Наблюдатель передаст имя контроллера и получит информацию о себе.

В моем случае служба представляет собой слой поверх $http, который просто отслеживает, какие части приложения делают какие запросы.

При желании я хотел бы ограничить эту функциональность контроллерами, которые внедряют эту конкретную службу.


person km6zla    schedule 07.02.2014    source источник


Ответы (1)


Декоратор области действия: $onRootScope

Украшает $rootScope методом $onRootScope, как было предложено title="$onRootScope">здесь

app.config(['$provide', function($provide){
    $provide.decorator('$rootScope', ['$delegate', function($delegate){

        // [Object.defineProperty()][2]
        // To make sure the $onRootScope property doesn't show up unexpected when enumerating over $scope we use `Object.defineProperty()` and set enumerable to false. Keep in mind that you might need an ES5 shim.

        Object.defineProperty($delegate.constructor.prototype, '$onRootScope', {
            value: function(name, listener){
                var unsubscribe = $delegate.$on(name, listener);
                this.$on('$destroy', unsubscribe);
            },
            enumerable: false
        });

        return $delegate;
    }]);
}]);

использованная литература

person km6zla    schedule 15.02.2014