Форум программистов, компьютерный форум, киберфорум
Наши страницы
JavaScript: Angular 2, AngularJS
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Halyluya
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 2
1

Нужен совет\подсказка по связи между 2мя контроллерами

21.02.2015, 20:22. Просмотров 649. Ответов 5
Метки нет (Все метки)

Приветствую, требуется совет\подсказка по ангулару, суть в чем - есть 2 контроллера ничем не связанные кроме родительского модуля, грубо говоря так:

Javascript
1
2
3
var app = angular.module('mainModule', []);
app.controller('FirstController', function () {});
app.controller('SecondController', function () {});
Очень хотелось бы их связать через "что-то" для обновления данных в обоих. Пробывал через сервис, примерно так

Javascript
1
2
3
4
5
6
7
app.service('ServiceName', function () {
    var _count = 1;
    return {
        getCount: function () { return _count },
        setToZeroCount: function () { _count = 0 },
    };
});
и в контроллах прописать
Javascript
1
2
3
4
5
6
app.controller('FirstController', function ($scope, ServiceName) {
      $scope.Something = ServiceName.getCount();
});
app.controller('SecondController', function (ServiceName) {
      SomeButtom = function(){ ServiceName.setToZeroCount(); };
});
по результату FirstController выполняет код и выводит на экран "1" т.к. это значение переменной по-умолчанию.
при нажатие на кнопку в SecondController - значение в сервисе _count меняется, НО уже не выводится на экран.
вопрос, возможно нужно прицепить событие или как-то дать понять контроллеру что значение обновилось и его надо считать еще раз. Или я просто пошел по неправильному пути и есть другой способ. Привел в пример упрощенный вариант, контроллеров больше и в сервисе не только менять на ноль значение а плюсовать и вычитать, но важен сам принцип.
благодарю за любые подсказки
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2015, 20:22
Ответы с готовыми решениями:

Вычислить значение выражения (нужен совет и подсказка!)
y=ln(x^3-8)+1/sin(a) при этом найти ОДЗ и обеспечить необходимую реакцию программы на некоректные...

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

Передача между контроллерами
#javaFX_pain Всем привет! <VBox xmlns="http://javafx.com/javafx/8.0.121"...

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

Передача переменной между контроллерами
Добрый день всем, столкнулся с такой проблеммой пытаюсь на другой контроллер передать переменную, ...

5
Qwertiy
823 / 631 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
24.02.2015, 15:37 2
Можно рассылать событие об изменении и подписываться на него.
0
vovandr
631 / 519 / 194
Регистрация: 19.08.2013
Сообщений: 1,400
03.03.2015, 23:11 3
Пример http://plnkr.co/edit/ys1qx0XNToCAw27v6GLV?p=preview
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
<body ng-app="mainModule">
    
    <div ng-controller="FirstController">
        {{Something}}
    </div>
    
     <div ng-controller="SecondController">
       <p>Кнопки из SecondController:</p>
       <button ng-click="resetCount()">Обнулить счетчик</button>
       <button ng-click="increaseCount()">Увеличить счетчик</button>
    </div>
    
  </body>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var app = angular.module('mainModule', []);
 
app.service('ServiceName', function () {
    var data = {
      count: 1
    };
    return {
        getCount: function () {
          return data.count;
          
        },
        setToZeroCount: function () { 
           data.count = 0 
          
        },
        increaseCount: function() {
           data.count++;
        }
    }; 
});
 
app.controller('FirstController', function ($scope, ServiceName) { 
      
      $scope.Something = ServiceName.getCount();
      
      $scope.$watch(function () { return ServiceName.getCount(); }, function (newValue, oldValue) {
        if (newValue !== oldValue) $scope.Something = newValue;
    });
    
});
app.controller('SecondController', function ($scope, ServiceName) {
      $scope.resetCount = function(){ 
        ServiceName.setToZeroCount(); 
      };
      $scope.increaseCount = function(){ 
        ServiceName.increaseCount(); 
      };
      
});
1
Qwertiy
823 / 631 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
04.03.2015, 01:13 4
Цитата Сообщение от vovandr Посмотреть сообщение
if (newValue !== oldValue)
Это не надо.

И зачем watch, если можно использовать события?
1
Halyluya
0 / 0 / 0
Регистрация: 21.02.2015
Сообщений: 2
04.03.2015, 12:14  [ТС] 5
Доброго времени суток, извиняюсь давно не заходил(ветка по ангулару здесь не очч популярна).

проблему с топика решил на событиях, пример вот
http://plnkr.co/edit/52RTpJ2pU9c3rwjKiKTA?p=preview

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
  <body ng-app="mainModule">
    <div ng-controller="FirstController">
        {{Something}}
    </div>
    <div ng-controller="SecondController">
      <p>Кнопки из SecondController:</p>
      <button ng-click="resetCount()">Обнулить счетчик</button>
      <button ng-click="increaseCount()">Увеличить счетчик</button>
    </div>
  </body>
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var app = angular.module('mainModule', []);
 
app.factory('ServiceName', function($rootScope) {
  var data = {};
 
  data.count = 0;
 
  data.getCount = function() {
    return this.count;
  },
  
  data.setToZeroCount = function() {
    this.count = 0;
    $rootScope.$emit('UpdateValue'); // оповещаем подписчиков об событии можно было через $broadcast но так должно работать чуть быстрее
 
  },
  data.increaseCount = function() {
    this.count++;
    $rootScope.$emit('UpdateValue');// аналогично
  };
  
  return data;
});
 
app.controller('FirstController', function($rootScope, $scope, ServiceName) {
 
  $scope.Something = ServiceName.getCount();
 
  $rootScope.$on('UpdateValue', function() {
    $scope.Something = ServiceName.getCount();
  });
});
 
app.controller('SecondController', function($scope, ServiceName) {
  $scope.resetCount = function() {
    ServiceName.setToZeroCount();
  };
  
  $scope.increaseCount = function() {
    ServiceName.increaseCount();
  };
 
});
Отдельное спасибо vovandr за код с примером и более красивым решением(соотвественно и читаемостью кода)
Для данного примера $watch явно более рациональное решение чем оповещение, хотя для более большого, наверное события более правильный подход. хотя хз. Опыта мало.

И еще пару вопросов, в свете оживления топика, какой способ более производительный, событие и оповещение или $watch ?

И почему вы написали что:
Цитата Сообщение от Qwertiy Посмотреть сообщение
Цитата Сообщение от vovandr Посмотреть сообщение
if (newValue !== oldValue)
Это не надо.
достаточно просто было ?
Javascript
1
2
3
4
$scope.$watch(function () { return ServiceName.getCount(); }, 
function (newValue, oldValue) {
        $scope.Something = newValue;
    });
Спасибо.
0
Qwertiy
823 / 631 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
04.03.2015, 13:57 6
Цитата Сообщение от Halyluya Посмотреть сообщение
Для данного примера $watch явно более рациональное решение чем оповещение
Watch проверяется при каждом digest-цикле, поэтому, на мой взгляд, события в данном случае лучше.

Цитата Сообщение от Halyluya Посмотреть сообщение
И почему вы написали что:
Нет смысла в watch'e сравнивать старое и новое значения.
Единственный случай, когда они будут равны - это первое исполнение watch'а.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// этот код:
app.controller('FirstController', function ($scope, ServiceName) { 
  $scope.Something = ServiceName.getCount();
      
  $scope.$watch(function () { return ServiceName.getCount(); }, function (newValue, oldValue) {
    if (newValue !== oldValue) {
      $scope.smth = newValue;
    }
  });
});
 
// я бы переписал так:
app.controller('FirstController', function ($scope, ServiceName) { 
  $scope.$watch(function () { return ServiceName.getCount(); }, function (value) {
    $scope.smth = value;
  });
});
Добавлено через 2 минуты
Да и вообще, от присваивания того же самого значения ничего страшного не произойдёт. А функция его вычисления будет вызвана watch'ем в любом случае, так что даже на этом экономии никакой.

Добавлено через 2 минуты
И да, в нормальном коде надо передавать массив с зависимостями и функцией.
Хотя для примера действительно удобнее просто функцию.
0
04.03.2015, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2015, 13:57

Обмен между контроллерами SPI
Привет. Хочу организовать обмен между несколькими контроллерами(stm32fx). Имеются следующие...

Как организовать обмен данными между двумя контроллерами
Заранее извиняюсь за нубский вопрос. Есть два микроконтроллера, шина данных (порты A, B), линия...

Как передавать данные между контроллерами Tab Bar-a
Как передавать данные между контроллерами Tab Bar и отслеживать нажатие кнопки например в первом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru