Il y a deux contr?leurs a et b?; il y a un événement de clic dans le contr?leur a. Après avoir cliqué, comment afficher un p dans le contr?le b??
Par exemple?: le contr?leur a est un menu, le contr?leur b est une zone de contenu, cliquez sur différents menus dans a, et contr?lez l'affichage de différents contenus dans b,
Quelques efforts?: j'ai essayé le service et l'usine, mais je ne peux que partager des données mais je ne peux pas les déclencher en temps réel
業(yè)精于勤,荒于嬉;行成于思,毀于隨。
J'ai essayé deux méthodes ici?:
1. Utilisez le propre mécanisme d'événement d'Angular
(function() {
'use strict';
angular
.module('app.core')
.factory('eventService', eventService);
/* @ngInject */
function eventService(logger) {
var service = {
on_angular_event: on_angular_event,
trigger_angular_event: trigger_angular_event
};
return service;
function on_angular_event(scope, type, f) {
scope.$on(type, function(event, data){
f(data);
// 處理時(shí)間后阻止事件繼續(xù)擴(kuò)散
event.stopPropagation = true;
})
}
function trigger_angular_event(scope, deriction, type, data) {
// deriction: up, down, sibling
if (deriction === 'up') {
scope.$emit(type, data);
} else if (deriction === 'down'){
scope.$broadcast(type, data);
} else if (deriction === 'sibling'){
scope.$parent.$broadcast(type, data);
}
}
}
})();
Utilisé dans le contr?leur, ajoutez a pour envoyer une notification d'événement à b?:
controller_A.$inject = [$scope, eventService];
function controller_A($scope, eventService) {
//send event
//direction 根據(jù) A 和 B 的關(guān)系來定,父子用up或down,兄弟用sibling
eventService.trigger_angular_event($scope, direction, 'event_name', data);
}
controller_B.$inject = [$scope, eventService];
function controller_B($scope, eventService) {
// recv event from controller_A
eventService.on_angular_event($scope, 'event_name', function(data){
// do something here
});
}
2. Utilisez le service pour simuler des événements de rappel. L'essence est d'utiliser le service pour enregistrer une fonction de rappel globale à utiliser entre les contr?leurs
.(function() {
'use strict';
angular
.module('app.core')
.factory('eventService', eventService);
/* @ngInject */
function eventService(logger) {
var onEventFunc = {};
var service = {
on: on,
trigger: trigger
};
return service;
function on(type, f) {
onEventFunc[type] = onEventFunc[type] || [];
var funcs = onEventFunc[type];
// Todo:同一個(gè)事件可以讓不同的監(jiān)聽者監(jiān)聽,但是同一個(gè)監(jiān)聽者的回調(diào)只能注冊(cè)一次。而回調(diào)函數(shù)多用匿名函數(shù)注冊(cè),此處用toString()進(jìn)行區(qū)分,效率較低。
var exist = false;
for (var i = 0; i < funcs.length; i++) {
if (funcs[i].toString() === f.toString()) {
exist = true;
break;
};
};
if (!exist) {
funcs.push(f);
};
}
function trigger(type, data) {
//logger.info('trigger', data);
for (var item in onEventFunc) {
if (item === type) {
var funcs = onEventFunc[item];
for (var i = 0; i < funcs.length; i++) {
funcs[i](data);
};
}
}
}
}
})();
Hmm. Vous pouvez essayer des mécanismes de diffusion d'événements et de tunneling.
Vous pouvez jeter un ?il à ceci
Pour être plus direct, vous pouvez essayer $broadcast et $on, mais l'efficacité sera médiocre
Voyant que ce qui est écrit ci-dessus n'est pas assez pur (mélangé à d'autres considérations), j'ajouterai une version pure.
Démo fournie
Le code est le suivant
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body ng-app="myApp">
<p ng-controller="aCtrl">
<button type="button" ng-click="click()">click</button>
</p>
<p ng-controller="bCtrl">
<p ng-if="showConfig.show">will show me</p>
</p>
<script src="../bower_components/angular/angular.min.js"></script>
<script>
// 通過事件,記得利用$rootScope 來廣播事件。
// 優(yōu)點(diǎn)是解耦,也是ng的一種通訊方式. 很容易理解
// 有人說什么性能差,效率不高之類的。 其實(shí)不是非常大的應(yīng)用完全不用關(guān)注這個(gè)。 我理解就是一種js級(jí)冒泡。 性能遠(yuǎn)遠(yuǎn)小于dom操作。
// angular.module('myApp', []).controller('aCtrl', function ($scope, $rootScope) {
// $scope.click = function () {
// $rootScope.$broadcast('do_show');
// };
// }).controller('bCtrl', function ($scope) {
// $scope.showConfig = {
// show: false
// };
// $scope.$on('do_show', function () {
// $scope.showConfig.show = !$scope.showConfig.show;
// })
// });
</script>
<script>
// 利用ng雙向綁定技術(shù)。 通過Service提供一個(gè)Scope,具備Scope的特性,利用這個(gè)Scope 把 aCtrl bCtrl 建立聯(lián)系。
// angular.module('myApp', []).controller('aCtrl', function ($scope, $rootScope, Service) {
// $scope.click = function () {
// Service.showConfig.show = !Service.showConfig.show;
// };
// }).controller('bCtrl', function ($scope, Service) {
// // 注意這里是把Scope賦值。 而非 Service.showConfig.show 一個(gè)值賦值。
// $scope.showConfig = Service.showConfig;
// }).factory('Service', function ($rootScope) {
// var showConfig = $rootScope.$new();
// showConfig.show = false;
// return {
// showConfig: showConfig
// };
// });
</script>
<script>
</script>
</body>
</html>
1). Créez un bus d'événements pour gérer tous les événements de manière globale
2). Utilisez $broadcast et $emit