Значение наблюдения AngularJS в сервисе

В настоящее время я разрабатываю веб-приложение AngularJS.

У меня есть основной вид (Index), дочерний вид (Dashboard) и вид внука (Raiding The Rails).

http://localhost:4000/#/dashboard/raiding-the-rails/1

В представлении внука (Raiding The Rails) я показываю информацию о платье, относящуюся к идентификатору состояния /1, каждое платье имеет указанный идентификатор состояния, например, /1, /2, /3.

У меня есть контроллер/служба, отправляющая идентификатор состояния в console.log (внутри родителя), и при просмотре raiding-the-rails/1 console.log отображает {stateID: "1"}. Если я изменю URL-адрес на raiding-the-rails/4, console.log не обновится, пока я не обновлю страницу.

Кроме того, когда я полностью обновляю браузер, console.log выдает три объекта вместо одного?

Я просмотрел множество сайтов и пытался снова и снова пытаться понять это, я даже пытался настроить службу Watch, но это не помогло.

Если бы кто-нибудь мог мне помочь, я был бы очень признателен!
Спасибо.

Консоль.Журнал

Приложение:

(function(angular, undefined){
  "use strict";
  var am = angular.module('virtual-fitting', ['ui.router']);
  am.config(function ($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state('dashboard', {
        url: '/dashboard',
        templateUrl: '../views/dashboard.html'
      })
      .state('dashboard.raidingtherails', {
        url: '/raiding-the-rails',
        templateUrl: '../views/dashboard.raiding-the-rails.html'
      })
      .state('dashboard.raidingtherails.dress', {
        url: '/:id',
        templateUrl: '../views/dashboard.raiding-the-rails.dress.html'
      });
      $urlRouterProvider.otherwise('/');
  });
})(angular);

Сервис:

(function(angular, undefined) {
  "use strict";
  var am = angular.module('virtual-fitting');
  am.factory('raidingService', function () {
    var raidingService = {
      stateID: null
    };
    return raidingService;
  });
})(angular);

Родительский контроллер:

(function(angular, undefined) {
  "use strict";
  var am = angular.module('virtual-fitting');
  am.controller('dashboardCtrl', function(raidingService) {
    console.log(raidingService);
  });
})(angular);

Дочерний контроллер:

(function(angular, undefined) {
  "use strict";
  var am = angular.module('virtual-fitting');
  am.controller('raidingtherailsCtrl', function($state, $stateParams, raidingService) {
    var self = this;
    raidingService.stateID = $stateParams.id;
  });
})(angular);

person Community    schedule 04.11.2015    source источник
comment
stackoverflow.com/a/21867646/1061668   -  person Mikko Viitala    schedule 04.11.2015
comment
@MikkoViitala Я реализовал это, но console.log показывает только предыдущий идентификатор, например, начать с /3, затем перейти к /6, консоль покажет идентификатор 3 при изменении состояния.   -  person    schedule 04.11.2015


Ответы (2)


Я предполагаю, что вы хотите наблюдать за своим сервисом в родительском контроллере?

Если это так, вы можете посмотреть функцию, например:

$scope.$watch(function() {
  return raidingService.stateId;
}, function(value) {
  console.log(value);
}, true);

Это должно сработать.

person Lee    schedule 04.11.2015
comment
Вечер Ли, Спасибо за это! Но, похоже, ничего не изменилось! При изменении идентификатора состояния с /1 на /2 журнал консоли по-прежнему выдавал три объекта, говорящие stateID: '1' вместо обновления и говорящие stateID: '2'... - person ; 04.11.2015
comment
Если я не обновлю новое состояние, консоль останется прежней! Любые дальнейшие мысли очень помогут! - person ; 04.11.2015
comment
Если вы получаете несколько журналов консоли, похоже, что ваша страница содержит несколько элементов управления панели инструментов, это правильно? Как выглядят ваши взгляды? В любом случае вы можете бросить его в JS Bin? - person Lee; 04.11.2015

Шаблон MVC, используемый в любой среде:

Вы создаете Service с помощью методов .get() и .set(). Метод Set обычно используется в любом месте, где вы хотите оперировать значением model, и позволяет вам создать одну точку, которая будет обрабатывать изменения в вашей модели. Последний шаг в методе .set().$boradcast() уведомление всего приложения об изменениях в вашей модели.

Плюсы:

  • одна точка доступа к стоимости
  • приложение знает о любых изменениях
  • не надо писать $watch при просмотре коллекций (холли-молли)
  • наличие точки доступа к изменениям с помощью «$ on» в ваших контроллерах $scope

Минусы:

  • легко забыть использовать метод .set() вместо простого присваивания
person Appeiron    schedule 04.11.2015
comment
Спасибо @Appeiron, я пытаюсь взять это на вооружение и переработать то, что я сделал до сих пор! но, борясь... - person ; 04.11.2015
comment
По моему опыту, $watch позволяет вам наблюдать за локальными изменениями в контроллере или его содержимом, не покидая его. Лучший способ перевести поток информации через приложение — это система уведомлений о событиях. - person Appeiron; 04.11.2015
comment
В вашем случае вам просто нужны эти методы set и get с on в ваших контроллерах. - person Appeiron; 04.11.2015
comment
Есть ли у вас какие-либо рекомендуемые сайты, которые посоветуют мне, как использовать Set, Get и On? - person ; 04.11.2015
comment
Постараюсь создать плунжер для тебя, приятель - person Appeiron; 04.11.2015
comment
Повезло @Appeiron? - person ; 05.11.2015
comment
Я устал и пошел спать, так что продолжим завтра ;D - person Appeiron; 05.11.2015
comment
Нет проблем, @Appeiron! Спасибо за помощь в любом случае, и я буду следить за вашим ответом завтра :) - person ; 05.11.2015