AngularJS 이벤트 발표 메커니즘
읽 지 않 은 메시지 알림
기구 사용자 나 기술 기구 가 비 강 검 기구 검사 에 대해 새로운 의견 을 발표 할 것 을 신청 할 때 상대방 에 게 소식 통 지 를 해 야 한다.
백 스테이지 가 매우 간단 해서 본 고 는 주로 프런트 에서 만난 문 제 를 해결한다.
역사가 남다.
이것 은 내 소식 이 남 긴 읽 지 않 은 메 시 지 를 통계 하 는 명령 으로 캐 시
superCache
를 사용 했다.한눈 에 보면 이
if...else
문 제 를 발견 할 수 있 을 것 입 니 다.첫 번 째 요청 으로 데 이 터 를 캐 시 에 넣 은 후에 캐 시 에서 계속 찾 았 습 니 다.이것 은 분명 문제 가 있 을 것 입 니 다!원래1
메시지 가 있 었 는데 클릭 하여 보 았 습 니 다.그리고 이 명령 은 캐 시 에서 가 져 온 데이터 이 고 하나 더 표 시 됩 니 다.
angular.module('webappApp')
.directive('yunzhiUnReadMessageCount', function(ToMessageService, superCache) {
return {
template: '',
restrict: 'E', //
link: function postLink(scope, element) {
//
if (typeof superCache.get('unReadMessageCount') === 'undefined') {
//
ToMessageService.pageReceiveUnReadMessageOfCurrentUser(undefined, function(data) {
//
superCache.put('unReadMessageCount', data.totalElements);
//
element.text(superCache.get('unReadMessageCount'));
});
} else {
//
element.text(superCache.get('unReadMessageCount'));
}
}
};
});
기능 실현로그아웃 시 캐 시 지우 기
로그아웃 할 때 캐 시 를 지우 지 않 으 면 다음 사용자 가 로그 인 할 때 이전 사용자 가 남 긴 캐 시 를 사용 하여 정보 알림 오류 가 발생 합 니 다.
읽 을 때 명령 을 다시 실행 합 니 다.
다음 그림 은 실현 해 야 할 난점 이다.
이 사용 자 는 읽 지 않 은 메 시 지 를 가지 고 있 습 니 다.사용자 가 이 메 시 지 를 읽 으 려 면 이 메 시 지 를 읽 은 상태 로 설정 한 다음 오른쪽 상단 의 읽 지 않 은 항목 수 를 동시에 수정 합 니 다.그러나 이 사건 을 클릭 하 는 것 은 컨트롤 러 에서 발생 하 는 것 이 고 메 시 지 는 추가 명령 이 며 이들 은 아무런 연관 이 없다.
AngularJS
의 정 수 는 바로Scope
이다.이것 은 두 개Scope
이 고 페이지 내용 은 우리 의 컨트롤 러Scope
이 며 오른쪽 상단 의 소식 처 는 우리 의 읽 지 않 은 메시지 명령Scope
이다.만약 에 간단 한 부자
Scope
관계 라면 우 리 는 컨트롤 러 에서 명령 을 전달 할 수 있 고 명령watch
이라는 매개 변 수 는 컨트롤 러 가 매개 변수 에 대한 변동 에 따라 명령 에 응답 할 수 있다.그런데 이 두 개Scope
는 아무 상관 이 없 는데 우 리 는 어 떡 하지?이벤트 발표
관련 자 료 를 찾 아 보 니
AngularJS
중Scope
사건 을 발표 할 수 있 었 다.$broadcast(name, args);
Dispatches an event name downwards to all child scopes (and their children) notifying the registered $rootScope.Scope listeners.
다음 사건 을 그의 모든 아들
Scope
에 게 나 누 어 주 고 등 록 된Scope
에 게 알 립 니 다.$emit(name, args);
Dispatches an event name upwards through the scope hierarchy notifying the registered $rootScope.Scope listeners.
$broadcast
와 유사 하지만 이것 은 사건 을 상부 에 발표 하 는 데 쓰 일 뿐이다.$on(name, listener);
Listens on events of a given type.
주어진 유형의 사건 을 감청 합 니 다.
예 를 들 어 angularjs$broadcast$emit$on 의 용법 을 설명 합 니 다.
<div ng-controller="ParentCtrl"> //
<div ng-controller="SelfCtrl"> //
<a ng-click="click()">click me</a>
<div ng-controller="ChildCtrl"></div> //
</div>
<div ng-controller="BroCtrl"></div> //
</div>
js 코드
appControllers.controller('SelfCtrl', function($scope) {
$scope.click = function () {
$scope.$broadcast('to-child', 'child');
$scope.$emit('to-parent', 'parent');
}
});
appControllers.controller('ParentCtrl', function($scope) {
$scope.$on('to-parent', function(d,data) {
console.log(data); //
});
$scope.$on('to-child', function(d,data) {
console.log(data); //
});
});
appControllers.controller('ChildCtrl', function($scope){
$scope.$on('to-child', function(d,data) {
console.log(data); //
});
$scope.$on('to-parent', function(d,data) {
console.log(data); //
});
});
appControllers.controller('BroCtrl', function($scope){
$scope.$on('to-parent', function(d,data) {
console.log(data); //
});
$scope.$on('to-child', function(d,data) {
console.log(data); //
});
});
클릭 하여 Click me 출력 결과child
parent
코드 구현
$rootScope
이 두 컨트롤 러 와 명령 사이
Scope
의 관 계 를 고려 하면 위로 든 아래로 든 받 지 못 할 수 있다.이 사건 을 직접
$rootScope
아래로 발표 하여 모든Scope
이 이 사건 을 얻 을 수 있 도록 합 니 다.현재Scope
와 목적Scope
간 의 관 계 를 고려 하지 않도록 해 야 한다.
// reloadMessageCount ,
$rootScope.$broadcast('reloadMessageCount');
각 층 간 의 직책 관 계 를 고려 하여 저 는 사건 발 표 는 방법 컨트롤 러 에 있어 야 하 며Service
에 두 어 서 는 안 된다 고 생각 합 니 다.Service
다른 사람 이 호출 되 기 를 기다 리 고 다른 파일 과 결합 해 서 는 안 되 며 그렇지 않 으 면 고치 기 어렵 습 니 다.$on
재 구성 명령 을 사용 하여
$on
감청 사건 을 발표 하고 해당 하 는 논 리 를 실행 하여 오른쪽 상단 의 읽 지 않 은 메시지 수 를 다시 표시 합 니 다.
angular.module('webappApp')
.directive('yunzhiUnReadMessageCount', function(ToMessageService, superCache) {
return {
template: '<b ng-if="count">{{ count }}</b>',
restrict: 'E', //
link: function postLink(scope) {
var self = this;
self.init = function() {
self.computeMessageCount();
};
//
self.computeMessageCount = function() {
//
if (angular.isUndefined(superCache.get('unReadMessageCount'))) {
//
ToMessageService.pageReceiveUnReadMessageOfCurrentUser(undefined, function(data) {
//
superCache.put('unReadMessageCount', data.totalElements);
//
scope.count = superCache.get('unReadMessageCount');
});
} else {
scope.count = superCache.get('unReadMessageCount');
}
};
// reloadMessageCount
scope.$on('reloadMessageCount', function() {
//
superCache.remove('unReadMessageCount');
//
self.computeMessageCount();
});
//
self.init();
}
};
});
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
연말이므로 웹 앱을 만들었습니다.minmax 패널을 번갈아 가서 총 득점을 겨루는 게임이다. 선수는 좋아하는 위치에서 시작된다. 후손은 선수가 선택한 위치를 포함한 세로 일렬 중에서 패널을 선택한다. 다시 선수는 후손이 선택한 패널을 포함한 가로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.