Передача текущей области в Службу AngularJS


правильно ли передавать "текущий"$scope к службе AngularJS?

Я нахожусь в ситуации, когда у меня есть $service, зная, что он потребляется только одним контроллером, и я хотел бы иметь ссылку на область контроллера в самих методах $service.

это философски исправить?

или мне лучше транслировать события в $rootScope, а затем заставить мой контроллер слушать их?

4 105

4 ответа:

чтобы контроллер знал, когда происходит что-то асинхронное, используйте Угловое обещания.

чтобы спровоцировать $apply, вам не нужен объем, вы можете вызвать $rootScope.$apply, так как нет никакой разницы, называя его в определенной области или в корне.

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

Я бы сказал, Если ваша функциональность специфична только для одного контроллера, чем вам не нужен сервис.

задачи контроллеров-манипулировать конкретной моделью, тогда как служба должна иметь дело с глобальными задачами. Я бы предпочел придерживаться этой парадигмы вместо того, чтобы смешивать вещи.

вот что говорят врачи

сервис

угловые сервисы-это синглеты, которые выполняют определенные задачи, общие для web приложения

контроллер

в Angular контроллер-это функция JavaScript (тип/класс), которая используется для увеличения экземпляров угловой области, исключая корневую область.

PS: кроме того, если вам нужно переварить вы также можете ввести $rootScope в вашем сервисе.

да. Вы можете передать $scope в службу при ее инициализации. В конструкторе службы вы можете назначить область для чего-то вроде этого._scope, а затем ссылаться на область внутри службы!

angular.module('blah').controller('BlahCtrl', function($scope, BlahService) {

    $scope.someVar = 4;

    $scope.blahService = new blahService($scope);

});

angular.module('blah').factory('blahService', function() {

    //constructor
    function blahService(scope) {
        this._scope = scope;

        this._someFunction()
    }

    //wherever you'd reference the scope
    blahService.prototype._someFunction = function() {

        this._scope['someVar'] = 5;

    }

    return blahService;

});

я лично считаю, что передает $scope для службы это плохая идея, потому что он создает своего рода циклическую ссылку: контроллер зависит от службы, а служба зависит от области действия контроллера.

помимо путаницы с точки зрения отношений, такие вещи, как этот, в конечном итоге мешают сборщику мусора.

мой предпочтительный подход-поставить домен объекта в области контроллера и передайте на службу. Таким образом, служба работает независимо от того, используется ли она внутри контроллера или, возможно, внутри другой службы в будущем.

например, если служба должна выталкивать и всплывать элементы из массива errors мой код будет такой:

var errors = [];
$scope.errors = errors;
$scope.myService = new MyService(errors);

служба взаимодействует с контроллером, работая на errors. Конечно, я должен быть осторожным, чтобы никогда не уничтожать всю ссылку на массив, но в конце концов это общий JS беспокойство.

Я бы никогда не хотел использовать трансляцию,$apply и / или подобные вещи, потому что хорошие ОО-практики imho всегда будут превосходить любые угловые магии.