Ось мій HTML-перегляд:
<div id="chatContainer">
<div id="users" ng-controller="usersController">
<div ng-repeat="user in users" class="userItem">{{user.username}}</div>
</div>
<div id="chatText" ng-controller="chatTextController">
<div ng-repeat="text in texts" class="text">{{text.text}}</div>
</div>
<div id="chatInput" ng-controller="chatInputController">
<input type="text" placeholder="Enter chat text here" id="chatInputTxt" ng-model="chatInputTxt">
</div>
</div>
Моя мета полягає в написанні контролера chatInputController, тому, коли користувач вводить в chatInputTxt, тексти в chatTextController оновлюються, кажучи по-іншому:
Як chatInputController доступ / спілкуватися з chatTextController?
З повагою
Відповіді:
0 для відповіді № 1Ви не повинні користуватися $emit
або $broadcast
коли це можливо, як більше послуг, які вимагають цього, тим більше усунення неполадок, які ви можете отримати.
Вкладені контролери в Angular.js автоматично отримують копію своїх батьків. це все автоматично.
<div ng-controller="controller1">
{{mySharedValue}} // bar
<div ng-controller="controller2">
{{mySharedValue }} // also bar
</div>
</div>
JS ...
function controller1($scope) { $scope.mySharedValue = foo; $scope.notify = function() {
console.log("I"m notified!")
}; }
function controller2($scope) { $scope.mySharedValue = bar; $scope.notify(); // logs "i"m notified!" }
-1 для відповіді № 2
У вас є кілька варіантів:
- Ви можете використовувати
$broadcast
і$on
спілкуватися з контролерами-братами - У вас є батьківський контролер, ви можете встановити об'єктина цьому контролері, який буде спільно використовуватися з дочірніми контролерами (просто переконайтеся, що ви розумієте, що наслідок Angular $ scope або речі заплутані, швидко). - https://github.com/angular/angular.js/wiki/Understanding-Scopes
- Використовуйте спільний сервіс для доступу до кожного контролера
-1 для відповіді № 3
Ви можете використовувати $ emit або $ broadcast для генерування події та передачі деяких даних.
$ broadcast - відправити подію до всіх дочірніх областей.
$ emit - відправити подію вгору через ієрархію області.
$ scope. $ broadcast ("eventName", param1, param2);
Таким чином, ви могли б транслювати з $ rootScope. Далі в іншому контролері використовують
$ scope. $ on ("eventName", функція (param1, param2) { })
піймати подію.
Ви також можете скористатися послугою та налаштувати годинникпослугу в кожному з ваших контролерів. Або ви можете мати батьківський контролер замість того, щоб забруднювати rootScope і робити трансляцію з батьківського контролера.
Якщо зв'язок здійснюється тільки одним способом, то від дочірньої області до батьківської області тоді випромінювання буде працювати від дочірнього контролера.