2013-10-01 1 views
1

У меня есть услуга под названием MyArticles. Используя $http GET, собирает все статьи для данной категории. Служба MyArticles впрыскивается в ControllerA, ControllerB, ControllerC, которая должна запускать некоторые команды после того, как MyArticles Promise будет разрешен.Как создать метод reset() в сервисе, который возвращает обещание?

Работает после первой инициализации, но я не знаю, что делать, если мне нужно сбросить() загруженные данные для MyArticles, так как команды в ControllerA, ControllerB, ControllerC запускаются только в первый раз после того, как обетование будет разрешено. Например, что делать, если я хочу получать статьи из другой категории?

Я пытаюсь найти шаблон для этого, и я написал следующее, я предполагаю, что это помогает понять, что я хотел бы достичь:

var MyApp = angular.module('MyApp', []); 

MyApp.config(function($locationProvider){ 

    $locationProvider.hashPrefix('!'); 

}); 

MyApp.factory('MyService', function($q,$timeout){ 

    var deferred; 

    var loadData = function(){ 

     deferred = $q.defer(); 

     $timeout(function(){ 
      deferred.resolve({ 
       myData: "test" 
      }); 
     }, 250); 

    }; 

    return { 

     reset: function(){ 

      loadData(); 

     }, 

     getPromise: function(){ 

      return deferred.promise; 

     } 

    }; 

}); 

MyApp.controller('MyCtrl', function($scope,MyService){ 

    $scope.foo = "Service share data"; 

    MyService.reset(); 

    MyService.getPromise().then(function(data){ 

     console.log(data); 

    }); 

}); 

* пример также доступен по адресу: http://jsbin.com/OCaNehe/2/

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

Спасибо, что посмотрели!

+0

Если вы хотите разрешить разные значения друг за другом, Promise - это неправильный шаблон, поскольку он представляет только одно значение. Посмотрите на что-то вроде потоков :-) Или просто реализуйте шаблон наблюдателя, который уже встроен в углы ... – Bergi

+0

@Bergi спасибо за то, что посмотрели! Я буду искать потоки :) И, конечно же, я доберусь до шаблона наблюдателя – punkbit

+0

@Bergi на самом деле, теперь мне интересно, что делать в контроллерах, если я не могу использовать шаблон обещания. Я могу запускать команды только в том случае, если данные доступны. Я попробую $ watch, но не уверен, что это сработает! Большое спасибо – punkbit

ответ

3

Другой вариант - использовать часы. См.: http://plnkr.co/edit/auovRxGPViyflUVPvG1A?p=preview. Это может быть проще поддерживать по сравнению с широковещательными передачами $ emit/$ в дальнейшем, особенно если у вас есть множество сервисов вместе с директивами и контроллерами, которые их используют.

Также вы можете подумать об использовании естественного разрешения наследования углового, но это зависит от вашего приложения.

+0

большое спасибо за ваше время! Это круто! Я изучал его и смотрел, как вы сказали, как лучшее решение! – punkbit

+0

в соответствии с этим (http://www.benlesh.com/2013/08/angularjs-watch-digest-and-apply-oh-my.html) он упоминает, что мы не должны использовать $ watch внутри контроллеров?! – punkbit

+0

Он пытается сказать, что большинство вещей в контроллерах не требуют таких часов, как директивы. Однако нет ничего плохого в установке часов в контроллерах. В этом случае вы делаете это, потому что хотите делиться данными через несколько контроллеров. На мой взгляд, проекту никогда не нужно много контроллеров или много кода в контроллерах. Большинство кодов могут классифицироваться в директивы и службы. Существуют и другие способы совместного использования данных, которые зависят от структуры вашего проекта, которая может быть лучше (иерархии областей, область действия директивы и т. Д.). – Helen