백 본 이벤트 이벤트 구독 및 게시 원본 읽 기

2598 단어
이벤트 이벤트 모듈 은 대상 에 게 이벤트 바 인 딩 과 트리거 를 할 수 있 으 며 백 본 의 핵심 모듈 입 니 다.
백 본 이벤트 모듈
  • 사용자 정의 이벤트 추가
  • off 사용자 정의 이벤트 삭제
  • 트리거 사용자 정의 이벤트 발송
  • once 한 번 만 실행 할 사용자 정의 이벤트 추가 (내부 의존. once)
  • listenTo 관찰 대상 추가
  • listenToOnce 한 번 만 수행 하 는 관찰 대상 추가
  • stopListening 추가 관찰 대상 삭제
  • ------------------------------------
    이벤트 바 인 딩 방법
       on: function(name, callback, context) {
          if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
          this._events || (this._events = {});
          var events = this._events[name] || (this._events[name] = []);
          events.push({callback: callback, context: context, ctx: context || this});
          return this;
        },
    

    현재 bancbone. event 의 인 스 턴 스 에 추가이벤트 속성, backbone. events 를 통 해 구독 하 는 모든 휴가 는 이 해시 표 에 있 습 니 다.
    _이벤트 의 구조, 먼저 해시 후 배열, 그 중에서 ctx, context 할당 반전 함수 의 this
        _events={
            eventName:[handlerObj,handlerObj,handlerObj],
            eventName:[{callback:function(){}, context: Object, ctx: Object}]
        }
    

    trigger:   
      trigger: function(name) {
          if (!this._events) return this;
          var args = slice.call(arguments, 1);  /*    callback        */
          if (!eventsApi(this, 'trigger', name, args)) return this;
          var events = this._events[name];
          var allEvents = this._events.all;
          if (events) triggerEvents(events, args);//triggerEvents    apply  call      
          if (allEvents) triggerEvents(allEvents, arguments); //            all   ,       name       all   
          return this;
        }
    

      
    triggerEvents: 실행이벤트 [name] 의 방법
    공식 적 으로 는 콜 의 성능 이 apply 보다 좋 기 때문에 세 개의 매개 변수 아래 는 모두 콜 을 사용 하고 세 개의 매개 변수 이상 은 apply 를 사용 합 니 다. 대신 의 요 구 는 이렇게 높 습 니 다.
      var triggerEvents = function(events, args) {
        var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
        switch (args.length) {
          case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);return;
          case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
          case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
          case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
          default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;
        }
      };
    

    좋은 웹페이지 즐겨찾기