웹 프론트엔드 JS 튜토리얼 Backbone.js 0.9.2 소스코드 주석 중국어번역버전_기본지식

Backbone.js 0.9.2 소스코드 주석 중국어번역버전_기본지식

May 16, 2016 pm 03:53 PM
중국인

// Backbone.js 0.9.2

 

// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.

// 백본은 MIT 라이선스에 따라 자유롭게 배포될 수 있습니다.

// 모든 세부 사항 및 문서는 다음을 참조하세요.

// http://backbonejs.org

(기능() {

 

  // 브라우저에서는 창 객체로 표시되고 Node.js에서는 전역 객체로 표시되는 전역 객체를 생성합니다.

  var 루트 = 이것;

 

  // 덮어쓰기 전 "Backbone" 변수의 값을 저장합니다.

  // 이름 충돌이 있거나 사양을 고려하는 경우 Backbone.noConstrict() 메서드를 사용하여 변수가 Backbone에 의해 점유되기 전의 값을 복원하고 이름 변경을 위해 Backbone 객체를 반환할 수 있습니다.

  var PreviousBackbone = root.Backbone;

 

  //Array.prototype의 슬라이스 및 스플라이스 메소드를 호출을 위한 로컬 변수에 캐시합니다.

  var 슬라이스 = Array.prototype.slice;

  var splice = Array.prototype.splice;

 

  var 백본;

  if( 내보내기 유형 !== '정의되지 않음') {

    백본 = 수출;

  } 또 다른 {

    백본 = 루트.백본 = {};

  }

 

  //백본 버전 정의

  백본.VERSION = '0.9.2';

 

  // 서버 환경에서 Underscore를 자동으로 가져옵니다. Backbone의 일부 메소드는 Underscore에 의존하거나 상속받습니다.

  var _ = 루트._;

  if(!_ && ( typeof 필요 !== '정의되지 않음'))

    _ = require('밑줄');

 

  // 타사 라이브러리를 보기(View), 이벤트 처리 및 서버 데이터와의 동기화(sync) 중에 라이브러리의 메소드를 호출하는 데 사용되는 통합 변수 "$"로 정의합니다.

  // 지원되는 라이브러리에는 jQuery, Zepto 등이 있습니다. 구문은 동일하지만 Zepto가 모바일 개발에 더 적합합니다. 주로 Webkit 핵심 브라우저를 대상으로 합니다.

  // Backbone에서 사용하기 위해 jQuery와 유사한 구문으로 사용자 정의 라이브러리를 사용자 정의할 수도 있습니다(때로는 jQuery 또는 Zepto보다 가벼운 사용자 정의 버전이 필요할 수 있음)

  // 여기에 정의된 "$"는 지역 변수이므로 Backbone 프레임워크 외부의 타사 라이브러리를 정상적으로 사용하는 데에는 영향을 미치지 않습니다.

  var $ = root.jQuery || root.Zepto ||

 

  // 타사 라이브러리를 수동으로 설정

  // Backbone을 가져오기 전에 타사 라이브러리를 가져오지 않은 경우 setDomLibrary 메소드를 통해 "$" 지역 변수를 설정할 수 있습니다.

  // setDomLibrary 메소드는 Backbone에서 사용자 정의 라이브러리를 동적으로 가져오는 데에도 일반적으로 사용됩니다.

  Backbone.setDomLibrary = 함수(lib) {

    $ = 라이브러리;

  };

  //"Backbone" 이후 프레임워크 이름 지정을 포기하고 일반적으로 이름 지정 충돌을 피하거나 이름 지정 방법을 표준화하는 데 사용되는 Backbone 개체를 반환합니다.

  // 예를 들어:

  // var bk = Backbone.noConstrict(); // "Backbone" 명명을 취소하고 Backbone 객체를 bk 변수에 저장합니다.

  // console.log(Backbone); // 이 변수는 더 이상 Backbone 객체에 접근할 수 없으며 Backbone이 정의되기 전의 값으로 복원됩니다.

  // var MyBackbone = bk; // 그리고 bk는 Backbone 객체를 저장하고 이름을 MyBackbone으로 바꿉니다.

  Backbone.noConstrict = function() {

    root.Backbone = 이전백본;

    이거 돌려줘;

  };

  // REST를 지원하지 않는 브라우저의 경우 Backbone.emulateHTTP = true로 설정할 수 있습니다.

  // 서버 요청은 POST 모드로 전송되며 작업 이름을 식별하기 위해 _method 매개 변수가 데이터에 추가되고 X-HTTP-Method-Override 헤더 정보도 전송됩니다.

  Backbone.emulateHTTP = 거짓;

 

  // application/json 인코딩을 지원하지 않는 브라우저의 경우 Backbone.emulateJSON = true로 설정할 수 있습니다.

  //요청 유형을 application/x-www-form-urlencoded로 설정하고 호환성을 위해 모델 매개변수에 데이터를 배치합니다.

  Backbone.emulateJSON = 거짓;

 

  // 사용자 정의 이벤트와 관련된 Backbone.Events

  // ------------------

 

  // eventSplitter는 여러 이벤트를 처리할 때 이벤트 이름에 대한 구문 분석 규칙을 지정합니다.

  var eventSplitter = /s /;

 

  // 사용자 정의 이벤트 관리자

  // 이벤트 관련 메소드를 객체에 바인딩하여 해당 객체에 커스텀 이벤트를 추가, 삭제, 트리거할 수 있습니다.

  var 이벤트 = Backbone.Events = {

 

    // 사용자 정의 이벤트와 콜백 함수를 현재 객체에 바인딩합니다.

    //콜백 함수의 컨텍스트 개체는 지정된 컨텍스트입니다. 컨텍스트가 설정되지 않은 경우 컨텍스트 개체는 기본적으로 현재 바인딩된 이벤트의 개체로 설정됩니다.

    // 이 메소드는 DOM Level2의 addEventListener 메소드와 유사합니다.

    // 이벤트를 사용하면 공백, 탭 등의 공백 문자로 구분된 여러 이벤트 이름을 지정할 수 있습니다.

    // 이벤트 이름이 "all"인 경우, 트리거 메소드를 호출하여 이벤트가 트리거되면 "all" 이벤트에 바인딩된 모든 콜백 함수가 호출됩니다.

    on : 함수(이벤트, 콜백, 컨텍스트) {

      //일부 함수에서 사용되는 지역 변수 정의

      var 호출, 이벤트, 노드, 꼬리, 목록;

      //콜백 함수를 설정해야 합니다.

      if(!콜백)

        이거 돌려줘;

      // eventSplitter를 통해 이벤트 이름을 구문 분석하고, 분할을 사용하여 여러 이벤트 이름을 배열로 분할합니다.

      // 일반적으로 여러 이벤트 이름을 지정하려면 공백 문자를 사용합니다.

      이벤트 = events.split(eventSplitter);

      // 호출은 현재 객체에 바인딩된 이벤트 및 콜백 함수 목록을 기록합니다.

      호출 = this._callbacks || (this._callbacks = {});

 

      // 이벤트 이름 목록을 반복하고 처음부터 끝까지 이벤트 이름을 이벤트 변수에 저장합니다.

      while(이벤트 = events.shift()) {

        // 이벤트에 바인딩된 콜백 함수를 가져옵니다.

        // 목록은 단일 이벤트 이름에 바인딩된 콜백 함수 목록을 저장합니다.

        // 함수 목록은 배열로 저장되지 않고, 여러 객체의 다음 속성을 통해 순차적으로 연관됩니다.

        /**数据格式如:

         * {

         * 꼬리: {객체},

         *   다음: {

         * 콜백: {함수},

         * 컨텍스트: {객체},

         *     다음: {

         * 콜백: {함수},

         * 컨텍스트: {객체},

         * 다음: {객체}

         * }

         * }

         * }*/

        // 목록의 각 수준에 있는 다음 객체는 콜백 이벤트와 관련된 정보(함수 본문, 컨텍스트 및 다음 콜백 이벤트)를 저장합니다.

        // 이벤트 목록의 최상위 수준에는 마지막으로 바인딩된 콜백 이벤트의 식별자를 저장하는 tail 개체가 저장됩니다(마지막 콜백 이벤트의 다음 개체와 동일한 개체).

        // tail 식별자를 통해 콜백 목록을 순회하면 마지막 콜백 함수에 도달했음을 알 수 있습니다.

        목록 = 통화[이벤트];

        // 노드 변수는 이 콜백 함수와 관련된 정보를 기록하는 데 사용됩니다.

        //tail은 마지막으로 바인딩된 콜백 함수의 식별자만 저장합니다.

        // 따라서 콜백 함수가 이전에 바인딩된 경우 이전 tail을 노드에 객체로 할당한 다음 tail에 대한 새 객체 식별자를 생성합니다.

        // 이전 콜백의 tail 객체에 이 콜백 이벤트를 추가하는 이유는 콜백 함수 목록의 객체 계층 구조를 바인딩 순서대로 정렬하기 위함입니다. (최근 바인딩된 이벤트는 맨 아래에 배치됩니다.)

        노드 = 목록 ? 목록.꼬리: {};

        node.next = 꼬리 = {};

        //이 콜백의 함수 본문과 컨텍스트 정보를 기록합니다.

        node.context = 컨텍스트;

        node.callback = 콜백;

        //현재 이벤트의 콜백 목록을 재조립합니다. 이 콜백 이벤트가 목록에 추가되었습니다.

        통화[이벤트] = {

          꼬리: 꼬리,

          다음 : 목록 ? list.next : 노드

        };

      }

      // 메소드 체인 호출을 용이하게 하기 위해 현재 객체를 반환합니다.

      이거 돌려줘;

    },

    // 객체에 바인딩된 이벤트나 콜백 함수를 제거합니다. 이벤트, 콜백, 컨텍스트를 통해 삭제해야 하는 이벤트나 콜백 함수를 필터링할 수 있습니다.

    // - 컨텍스트가 비어 있으면 콜백에 지정된 모든 함수를 제거합니다.

    // - 콜백이 비어 있으면 이벤트의 모든 콜백 함수를 제거합니다.

    // - 이벤트가 비어 있으나 콜백이나 컨텍스트가 지정된 경우 콜백이나 컨텍스트에 지정된 콜백 함수를 제거합니다. (이벤트 이름은 구분되지 않습니다.)

    // - 매개변수가 전달되지 않으면 객체에 바인딩된 모든 이벤트와 콜백 함수를 제거합니다.

    off : 함수(이벤트, 콜백, 컨텍스트) {

      var 이벤트, 호출, 노드, 테일, cb, ctx;

 

      // 이벤트가 없거나 *모든* 이벤트를 제거합니다.

      //현재 객체에는 바인딩된 이벤트가 없습니다.

      if(!( 통화 = this._callbacks))

        반품;

      // 매개변수가 지정되지 않은 경우 모든 이벤트 및 콜백 함수를 제거합니다(_callbacks 속성 제거).

      if(!(이벤트 || 콜백 || 컨텍스트)) {

        this._callbacks 삭제;

        이거 돌려줘;

      }

 

      // 제거해야 할 이벤트 목록을 구문 분석합니다.

      // - 이벤트가 지정되면 eventSplitter에 따라 이벤트 이름이 구문 분석됩니다.

      // - 이벤트가 지정되지 않은 경우 바인딩된 모든 이벤트의 이름 목록을 구문 분석합니다.

      이벤트 = 이벤트 ? events.split(eventSplitter) : _.keys(calls);

 

      // 루프 이벤트 이름 목록

      while(이벤트 = events.shift()) {

        // 목록에서 현재 이벤트 객체를 제거하고 노드 변수에 캐시합니다.

        노드 = 호출[이벤트];

        통화 삭제[이벤트];

        // 현재 이벤트 객체가 존재하지 않는 경우(또는 제거 필터 조건이 지정되지 않은 경우 현재 이벤트 및 모든 콜백 함수가 제거되는 것으로 간주) 이 작업을 종료합니다(이전 단계에서 이벤트 객체가 제거되었습니다) )

        if(!노드 || !(콜백 || 컨텍스트))

          계속하다;

        // 표시된 콜백을 생략하고 새 목록을 만듭니다.

        // 콜백 함수나 컨텍스트 필터 조건에 따라 새로운 이벤트 객체를 조립하고 리바인드합니다.

        꼬리 = node.tail;

        // 이벤트의 모든 콜백 객체를 순회합니다.

        while(( node = node.next) !== tail) {

          cb = node.callback;

          ctx = node.context;

          // 콜백 함수와 파라미터에 있는 context를 기반으로 콜백 함수를 필터링하고, 필터링 조건에 맞지 않는 콜백 함수를 이벤트에 다시 바인딩합니다. (위에서 이벤트의 콜백 함수를 모두 제거했기 때문입니다.)

          if((콜백 && cb !== 콜백) || (컨텍스트 && ctx !== 컨텍스트)) {

            this.on(이벤트, cb, ctx);

          }

        }

      }

 

      이거 돌려줘;

    },

    // 정의된 하나 이상의 이벤트를 트리거하고 바인딩된 콜백 함수 목록을 순서대로 실행합니다.

    트리거 : 함수(이벤트) {

      var 이벤트, 노드, 호출, 꼬리, 인수, 모두, 나머지;

      //현재 객체에는 바인딩된 이벤트가 없습니다.

      if(!( 통화 = this._callbacks))

        이거 돌려줘;

      // 콜백 함수 목록에 바인딩된 "모든" 이벤트 목록을 가져옵니다.

      모두 = 통화.모두;

      // eventSplitter 규칙에 따라 배열로 트리거되어야 하는 이벤트 이름을 구문 분석합니다.

      이벤트 = events.split(eventSplitter);

      // 두 번째부터 트리거의 매개변수를 나머지 변수에 기록하고, 이는 차례로 콜백 함수에 전달됩니다.

      나머지 = Slice.call(인수, 1);

 

      // 트리거되어야 하는 이벤트 목록을 반복합니다.

      while(이벤트 = events.shift()) {

        // 여기의 노드 변수는 현재 이벤트의 모든 콜백 함수 목록을 기록합니다.

        if( 노드 = 호출[이벤트]) {

          //tail 변수는 마지막 바인딩 이벤트의 개체 ID를 기록합니다.

          꼬리 = node.tail;

          //노드 변수의 값은 이벤트 바인딩 순서에 따라 바인딩된 단일 콜백 이벤트 객체에 순차적으로 할당됩니다.

          // 마지막으로 바인딩된 이벤트의 next 속성은 tail과 동일한 객체를 참조하며, 이는 목록의 끝에 도달했는지 판단하는 기준으로 사용됩니다.

          while(( node = node.next) !== tail) {

            // 바인딩된 모든 이벤트를 실행하고 트리거 호출 시 매개변수를 콜백 함수에 전달합니다.

            node.callback.apply(node.context || this, 나머지);

          }

        }

        // all 변수는 바인딩 중 'all' 이벤트를 기록합니다. 즉, 어떤 이벤트가 호출되면 'all' 이벤트에 포함된 콜백 함수가 실행됩니다.

        // - "all" 이벤트의 콜백 함수는 바인딩 순서와 관계없이 현재 이벤트의 모든 콜백 함수 목록이 실행된 후 순차적으로 실행됩니다.

        // - "all" 이벤트는 일반 이벤트가 발생할 때 자동으로 호출되어야 합니다. "all" 이벤트가 강제로 트리거되면 해당 이벤트의 콜백 함수가 두 번 실행됩니다.

        if(노드 ​​= 모두) {

          꼬리 = node.tail;

          //일반 이벤트의 콜백 함수 호출과 다른 점은 all 이벤트는 현재 호출된 이벤트 이름을 콜백 함수의 첫 번째 매개변수로 전달한다는 점입니다.

          args = [이벤트].concat(rest);

          // "all" 이벤트의 콜백 함수 목록을 탐색하고 실행합니다.

          while(( node = node.next) !== tail) {

            node.callback.apply(node.context || this, args);

          }

        }

      }

 

      이거 돌려줘;

    }

  };

 

  // 이전 버전의 Backbone과의 호환성을 위한 바인딩 이벤트 및 릴리스 이벤트에 대한 별칭

  Events.bind = 이벤트.온;

  Events.unbind = Events.off;

 

  // Backbone.Model 데이터 객체 모델

  //-------------

 

  // Model은 Backbone의 모든 데이터 객체 모델의 기본 클래스로, 데이터 모델을 생성하는 데 사용됩니다.

  // @param {Object} 속성은 모델 생성 시 초기화 데이터를 지정합니다.

  // @param {Object} 옵션

  /*** @format 옵션

   * {

   * 구문 분석: {부울},

   * 컬렉션: {컬렉션}

   * }*/

  var Model = Backbone.Model = function(속성, 옵션) {

    // defaults 변수는 모델의 기본 데이터를 저장하는 데 사용됩니다.

    var 기본값;

    // 속성 매개변수가 지정되지 않은 경우 속성을 빈 객체로 설정합니다.

    속성 || (속성 = {});

    //속성 기본 데이터의 구문 분석 방법을 설정합니다. 예를 들어 기본 데이터는 서버에서 가져옵니다(또는 원본 데이터는 XML 형식임). 설정된 메서드에 필요한 데이터 형식과 호환되도록 구문 분석합니다. 메소드를 사용하여 구문 분석할 수 있습니다.

    if(옵션 && options.parse)

      속성 = this.parse(속성);

    if( defaults = getValue(this, 'defaults')) {

      // 모델이 정의될 때 기본값 데이터를 설정하면 초기화 데이터는 기본값 및 속성 매개변수와 병합된 데이터를 사용합니다. (속성의 데이터는 기본값의 동일한 이름으로 데이터를 덮어씁니다.)

      속성 = _.extend({}, 기본값, 속성);

    }

    // 모델이 속한 Collection 객체를 명시적으로 지정합니다. (모델을 컬렉션에 추가하기 위해 Collection의 add, push 등의 메소드를 호출하면 모델이 속한 Collection 객체가 자동으로 설정됩니다.)

    if(옵션 && options.collection)

      this.collection = 옵션.collection;

    //attributes 속성은 현재 모델의 JSON 객체화된 데이터를 저장하며 모델 생성 시 기본적으로 비어 있습니다.

    this.attributes = {};

    // 이스케이프 메소드를 통해 처리된 데이터를 캐시할 _escapedAttributes 캐시 객체를 정의합니다.

    this._escapedAttributes = {};

    // 각 모델에 대한 고유 식별자를 구성합니다.

    this.cid = _.uniqueId('c');

    //데이터 상태를 기록하는 데 사용되는 일련의 객체를 정의합니다. 구체적인 의미는 객체 정의 시 주석을 참조하세요.

    this.changed = {};

    this._silent = {};

    this._pending = {};

    // 인스턴스 생성 시 초기화 데이터를 설정합니다. 자동 매개변수를 처음 사용하면 변경 이벤트가 발생하지 않습니다.

    this.set(속성, {

      침묵 : 사실

    });

    // 초기화 데이터가 위에서 설정되었습니다. 변경된 상태, _silent, _pending 개체가 여기에서 다시 초기화되었을 수 있습니다.

    this.changed = {};

    this._silent = {};

    this._pending = {};

    // _previousAttributes 변수는 모델 데이터의 복사본을 저장합니다.

    //change 이벤트에서 모델 데이터가 변경되기 전의 상태를 가져오는 데 사용됩니다. 이전 상태의 데이터는 이전 또는 이전 속성 메소드를 통해 가져올 수 있습니다.

    this._previousAttributes = _.clone(this.attributes);

    //초기화 메소드 호출

    this.initialize.apply(this, 인수);

  };

  // 모델 프로토타입에 대한 일련의 속성과 메서드를 정의하려면 확장 메서드를 사용하세요.

  _.extend(Model.prototype, 이벤트, {

 

    //변경된 속성은 set 메소드가 호출될 때마다 변경된 데이터의 키 컬렉션을 기록합니다.

    변경됨: null,

 

    // // 자동 속성이 지정되면 변경 이벤트가 발생하지 않으며, 다음 변경 이벤트가 발생할 때까지 변경된 데이터가 기록됩니다.

    // _silent 속성은 자동 사용 시 변경된 데이터를 기록하는 데 사용됩니다.

    _silent : null,

 

    _보류 중 : null,

 

    // 각 모델의 고유 식별 속성(기본값은 "id", id 속성 이름은 idAttribute를 수정하여 사용자 정의 가능)

    // 데이터 설정 시 id 속성이 포함된 경우 해당 id가 모델의 id보다 우선 적용됩니다.

    // ID는 컬렉션에서 모델을 찾고 식별하는 데 사용됩니다. 백엔드 인터페이스와 통신할 때 ID는 레코드의 식별자로도 사용됩니다.

    id속성: 'id',

 

    // 모델 초기화 메소드, 모델 구축 후 자동 호출

    초기화 : 함수() {

    },

    // 현재 모델의 데이터 복사본을 반환합니다(JSON 개체 형식).

    toJSON : 함수(옵션) {

      return _.clone(this.attributes);

    },

    //attr 속성 이름에 따라 모델의 데이터 값을 가져옵니다.

    get : 함수(속성) {

      return this.attributes[attr];

    },

    //attr 속성 이름에 따라 모델의 데이터 값을 얻습니다. 데이터 값에 포함된 HTML 특수 문자는 & &lt >

    // _.escape 메소드를 통해 구현됨

    탈출 : 함수(속성) {

      varhtml;

      // _escapedAttributes 캐시 객체에서 데이터를 찾고, 데이터가 캐시된 경우 직접 반환합니다.

      if(html = this._escapedAttributes[attr])

        HTML을 반환;

      // _escapedAttributes 캐시 객체에서 데이터를 찾을 수 없습니다.

      // 그런 다음 먼저 모델에서 데이터를 가져옵니다.

      var val = this.get(attr);

      // _.escape 메서드를 사용하여 데이터의 HTML을 엔터티로 변환하고 다음에 쉽게 검색할 수 있도록 _escapedAttributes 개체에 캐시합니다.

      return this._escapedAttributes[attr] = _.escape(val == null ? '' : '' val);

    },

    // 모델에 특정 속성이 존재하는지 확인합니다. 해당 속성의 값을 Boolean 유형으로 변환하여 값이 false인 경우 존재하지 않는 것으로 간주합니다.

    // 값이 false, null, 정의되지 않음, 0, NaN 또는 빈 문자열인 경우 false로 변환됩니다.

    있음 : 함수(속성) {

      return this.get(attr) != null;

    },

    //모델에 데이터를 설정합니다. 키 값이 없으면 새 속성으로 모델에 추가됩니다. 키 값이 이미 있으면 새 값으로 수정됩니다.

    설정 : 함수(키, 값, 옵션) {

      // attrs 변수에 설정해야 하는 데이터 객체를 기록합니다.

      var 속성, 속성, 발;

 

      // 매개변수 형식은 키-값 개체 형식을 허용하거나 키 및 값 매개변수를 통해 별도의 설정을 허용합니다.

      // key가 객체인 경우 객체 형태로 설정된 것으로 간주하고, 두 번째 매개변수는 옵션 매개변수로 간주한다.

      if(_.isObject(key) || 키 == null) {

        속성 = 키;

        옵션 = 가치;

      } 또 다른 {

        // 키와 값의 두 매개변수를 별도로 설정하고 데이터를 attrs 객체에 넣어 통합 처리합니다.

        속성 = {};

        attrs[키] = 값;

      }

 

      // 옵션 구성 항목은 객체여야 합니다. 옵션이 설정되지 않은 경우 기본값은 빈 객체입니다.

      옵션 || (옵션 = {});

      // 매개변수가 설정되지 않은 경우 아무 작업도 수행되지 않습니다.

      if(!attrs)

        이거 돌려줘;

      // 설정되는 데이터 객체가 Model 클래스의 인스턴스에 속하는 경우 Model 객체의 데이터 객체 속성을 attrs에 할당합니다.

      // 일반적으로 이 작업은 한 Model 개체에서 다른 Model 개체로 데이터를 복사할 때 수행됩니다.

      if(모델 인스턴스 속성)

        attrs = attrs.attributes;

      // 옵션 구성 객체에 unset 속성이 설정된 경우 attrs 데이터 객체의 모든 속성을 정의되지 않음으로 재설정합니다.

      // 일반적으로 한 Model 객체에서 다른 Model 객체로 데이터를 복사할 때 이 작업을 수행하는데, 값은 복사하지 않고 Model 내부의 데이터만 복사하면 됩니다.

      if(options.unset)

        for(속성 속의 속성)

        속성[속성] =

        무효 0;

 

      //현재 데이터를 검증하고, 검증에 실패하면 실행을 중지합니다.

      if(!this._validate(속성, 옵션))

        거짓을 반환;

 

      // 설정된 id 속성 이름이 데이터 컬렉션에 포함된 경우 해당 id를 모델의 id 속성에 덮어씁니다.

      // id 속성명을 커스터마이징한 후 모델의 id 속성에 접근할 때 해당 id에 올바르게 접근할 수 있도록 하기 위한 것입니다.

      if(attrs의 this.idAttribute)

        this.id = attrs[this.idAttribute];

 

      var 변경 = options.changes = {};

      // 이제 현재 모델의 데이터 객체를 기록합니다.

      var now = this.attributes;

      // escaped는 현재 모델에서 escape로 캐시된 데이터를 기록합니다.

      var escaped = this._escapedAttributes;

      // prev는 모델의 데이터가 변경되기 전의 값을 기록합니다.

      var prev = this._previousAttributes ||

 

      // 설정해야 하는 데이터 객체를 탐색합니다.

      for(attr in attrs) {

        // attr은 현재 속성 이름을 저장하고, val은 현재 속성 값을 저장합니다.

        값 = 속성[속성];

 

        // 현재 데이터가 모델에 없거나, 변경되었거나, 옵션에 unset 속성 삭제가 지정된 경우 _escapedAttributes의 데이터로 대체된 데이터를 삭제합니다.

        if(!_.isEqual(now[attr], val) || (options.unset && _.has(now, attr))) {

          // 이스케이프를 통해 캐시된 데이터만 삭제합니다. 이는 캐시에 있는 데이터가 모델의 실제 데이터와 동기화되도록 하기 위한 것입니다.

          삭제 이스케이프됨[attr];

          // 자동 속성이 지정되면 이 set 메소드 호출에 의해 변경 이벤트가 발생하지 않으므로 변경된 데이터가 _silent 속성에 기록되므로 다음에 변경 이벤트가 발생할 때 이벤트 청취 기능이 수행됩니다. 데이터가 변경되었음을 알립니다.

          // 자동 속성이 지정되지 않은 경우 변경 속성의 현재 데이터를 변경된 상태로 직접 설정합니다.

          (options.silent ? this._silent : 변경)[attr] = true;

        }

 

        // 옵션에 unset이 설정되어 있으면 모델에서 데이터(키 포함)를 삭제합니다.

        // unset 속성을 지정하지 않으면 신규 또는 수정된 데이터가 추가되는 것으로 간주하여 모델의 데이터 객체에 새로운 데이터가 추가됩니다.

        옵션.설정 해제?

        지금 삭제[attr] : 지금[attr] = val;

 

        // 모델의 데이터가 새 데이터와 일치하지 않으면 데이터가 변경되었음을 의미합니다.

        if(!_.isEqual(prev[attr], val) || (_.has(now, attr) != _.has(prev, attr))) {

          // 변경된 속성에 현재 속성의 변경된 상태를 기록합니다.

          this.changed[attr] = 발;

          if(!options.silent)

            this._pending[attr] = true;

        } 또 다른 {

          // 데이터가 변경되지 않은 경우 변경된 속성에서 변경된 상태를 제거합니다.

          이것을 삭제하세요.변경됨[attr];

          이것을 삭제하세요._pending[attr];

        }

      }

 

      // 변경 이벤트에 바인딩된 함수를 트리거하는 변경 메서드를 호출합니다.

      if(!options.silent)

        this.change(옵션);

      이거 돌려줘;

    },

    //현재 모델에서 지정된 데이터를 삭제합니다. (속성도 동시에 삭제됩니다.)

    unset : 함수(속성, 옵션) {

      (옵션 || (옵션 = {})).unset = true;

      // options.unset 구성 항목을 통해 삭제 작업을 수행하도록 set 메소드에 알립니다.

      return this.set(attr, null, options);

    },

    // 현재 모델의 모든 데이터와 속성을 지웁니다.

    클리어 : 기능(옵션) {

      (옵션 || (옵션 = {})).unset = true;

      // 현재 모델의 속성 복사본을 복제하고, options.unset 구성 항목을 통해 삭제 작업을 수행하도록 set 메서드에 지시합니다.

      return this.set(_.clone(this.attributes), options);

    },

    // 서버에서 기본 모델 데이터를 가져옵니다. 데이터를 가져온 후 set 메소드를 사용하여 데이터를 모델에 채웁니다. 따라서 가져온 데이터가 현재 모델의 데이터와 일치하지 않으면 변경 이벤트가 트리거됩니다. .

    가져오기 : 함수(옵션) {

      // options가 새 객체인지 확인한 다음 options의 속성을 변경합니다.

      옵션 = 옵션 ? _.clone(옵션) : {};

      var 모델 = 이것;

      // 옵션에서 데이터를 성공적으로 얻은 후 사용자 정의 콜백 함수를 지정할 수 있습니다.

      var 성공 = options.success;

      // 데이터를 성공적으로 가져오면 데이터를 입력하고 사용자 정의 성공 콜백 함수를 호출합니다.

      options.success = function(resp, 상태, xhr) {

        // 서버가 반환한 데이터를 파싱 메소드를 통해 변환

        // 변환된 데이터를 set 메소드를 통해 모델에 채워서 변경 이벤트가 발생하도록 합니다. (데이터가 변경될 때)

        // 데이터를 채울 때 유효성 검사에 실패하면 사용자 정의 성공 콜백 함수가 호출되지 않습니다.

        if(!model.set(model.parse(resp, xhr), 옵션))

          거짓을 반환;

        //사용자 정의 성공 콜백 함수 호출

        만약(성공)

          성공(모델, 담당자);

      };

      // 요청에 오류가 발생하면 WrapError를 통해 오류 이벤트를 처리합니다.

      options.error = Backbone.wrapError(options.error, 모델, 옵션);

      // 서버에서 데이터를 가져오기 위해 동기화 메소드를 호출합니다.

      return (this.sync || Backbone.sync).call(this, 'read', this, options);

    },

    //모델의 데이터를 서버에 저장

    저장 : 함수(키, 값, 옵션) {

      // attrs는 서버에 저장해야 하는 데이터 객체를 저장합니다.

      var 속성, 현재;

 

      //단일 속성 키 설정 지원: value

      // 객체 형태의 {key: value} 일괄 설정 방법 지원

      if(_.isObject(key) || 키 == null) {

        // 키가 객체인 경우 객체 메소드를 통해 설정되는 것으로 간주됩니다.

        // 이때 두 번째 매개변수는 옵션으로 간주됩니다.

        속성 = 키;

        옵션 = 가치;

      }또 다른 {

        // 단일 속성이 key:value 형식으로 설정된 경우 attrs를 직접 설정합니다.

        속성 = {};

        attrs[키] = 값;

      }

      // 구성 객체는 새로운 객체여야 합니다.

      옵션 = 옵션 ? _.clone(옵션) : {};

 

      // 옵션에 대기 옵션이 설정되어 있으면 변경된 데이터를 미리 검증하여 서버가 새로운 데이터에 응답하지 않거나 응답이 실패하는 경우 로컬 데이터를 수정 전 상태로 복원합니다.

      // wait 옵션이 설정되지 않은 경우 서버 설정 성공 여부와 관계없이 로컬 데이터는 최신 상태로 수정됩니다.

      if(options.wait) {

        // 저장해야 할 데이터를 미리 확인한다

        if(!this._validate(속성, 옵션))

          거짓을 반환;

        //현재 모델에 데이터를 기록하며, 데이터를 서버로 전송한 후 복원하는 데 사용됩니다.

        // 서버 응답이 실패하거나 데이터가 반환되지 않는 경우 수정 전 상태를 유지할 수 있습니다.

        현재 = _.clone(this.attributes);

      }

 

      // SilentOptions는 옵션 개체에 자동을 추가합니다(데이터 확인 없음).

      // 위에서 데이터가 검증되었으므로 wait 파라미터 사용 시 SilentOptions 구성 항목을 사용합니다.

      // wait 매개변수가 설정되지 않은 경우 원래 옵션 구성 항목이 계속 사용됩니다.

      var SilentOptions = _.extend({}, 옵션, {

        침묵 : 사실

      });

      // 가장 최근에 수정된 데이터를 모델에 저장하여, 모델 데이터를 sync 메소드로 얻어 서버에 저장할 수 있도록 합니다.

      if(attrs && !this.set(attrs, options.wait ? SilentOptions : options)) {

        거짓을 반환;

      }

 

      var 모델 = 이것;

      // 옵션에서 데이터를 성공적으로 저장한 후 사용자 정의 콜백 함수를 지정할 수 있습니다.

      var 성공 = options.success;

      //서버가 성공적으로 응답한 후 성공 실행

      options.success = function(resp, 상태, xhr) {

        // 서버 응답의 최신 상태 데이터를 가져옵니다.

        var serverAttrs = model.parse(resp, xhr);

        // wait 매개변수를 사용하면 수정된 데이터 상태가 먼저 모델에 직접 설정됩니다.

        if(options.wait) {

          옵션 삭제.잠깐;

          serverAttrs = _.extend(attrs || {}, serverAttrs);

        }

        //최신 데이터 상태를 모델에 설정

        // set 메소드 호출 시 검증에 실패하면 커스텀 성공 콜백 함수가 호출되지 않습니다.

        if(!model.set(serverAttrs, 옵션))

          거짓을 반환;

        만약(성공) {

          //응답이 성공한 후 맞춤형 성공 콜백 함수를 호출합니다.

          성공(모델, 담당자);

        } 또 다른 {

          // 사용자 정의 콜백이 지정되지 않은 경우 기본적으로 동기화 이벤트가 트리거됩니다.

          model.trigger('sync', 모델, resp, 옵션);

        }

      };

      // 요청에 오류가 발생하면 WrapError를 통해 오류 이벤트를 처리합니다.

      options.error = Backbone.wrapError(options.error, 모델, 옵션);

      //모델의 데이터를 서버에 저장

      // 현재 모델이 새로 생성된 모델(id 없음)이면 create 메소드(new)를 사용하고, 그렇지 않으면 update 메소드(modified)로 간주합니다.

      var 메소드 = this.isNew() ? '생성': '업데이트';

      var xhr = (this.sync || Backbone.sync).call(this, 메소드, this, 옵션);

      // options.wait가 설정되어 있으면 데이터를 수정 전 상태로 복원합니다.

      // 저장된 요청은 현재 응답을 받지 못했기 때문에 응답이 실패할 경우 모델은 수정 전 상태를 유지하게 되며, 서버가 성공적으로 응답하면 모델 내의 데이터는 성공 시 최신 상태로 설정됩니다. .

      if(옵션.기다림)

        this.set(current, SilentOptions);

      xhr을 반환합니다.

    },

    //모델 삭제, 모델이 속한 컬렉션에서 모델이 삭제됩니다.

    // 클라이언트에서 모델이 생성된 경우 클라이언트에서 직접 삭제합니다.

    // 모델 데이터가 서버에 동시에 존재할 경우, 서버측 데이터도 동시에 삭제됩니다.

    파괴 : 기능(옵션) {

      // 구성 항목은 새로운 객체여야 합니다.

      옵션 = 옵션 ? _.clone(옵션) : {};

      var 모델 = 이것;

      // 옵션에서 데이터가 성공적으로 삭제된 후 사용자 정의 콜백 함수를 지정할 수 있습니다.

      var 성공 = options.success;

      // 데이터 삭제를 위해 성공적으로 호출되면 소멸 이벤트가 트리거됩니다. 모델이 컬렉션에 존재하는 경우 컬렉션은 소멸 이벤트를 수신하고 트리거될 때 컬렉션에서 모델을 제거합니다.

      // 모델 삭제 시 모델 안의 데이터가 지워지지 않은 상태인데, 해당 모델이 컬렉션에서 제거되었기 때문에 해당 모델에 대한 참조가 어디에도 없으면 자동으로 메모리에서 해제됩니다.

      // 모델 삭제 시 모델 객체의 참조 변수를 null로 설정하는 것을 권장합니다.

      var TriggerDestroy = 함수() {

        model.trigger('파괴', 모델, model.collection, 옵션);

      };

      // 모델이 클라이언트에서 새로 생성한 모델인 경우, TriggerDestroy를 직접 호출하여 컬렉션에서 해당 모델을 제거합니다.

      if(this.isNew()) {

        TriggerDestroy();

        거짓을 반환;

      }// 서버에서 데이터 삭제가 성공한 경우

      options.success = 함수(resp) {

        // 옵션 객체에 대기 항목이 구성되어 있으면 서버 데이터가 성공적으로 삭제된 후 로컬 메모리에 있는 모델 데이터가 삭제된다는 의미입니다.

        // 서버 응답이 실패하면 로컬 데이터는 삭제되지 않습니다.

        if(옵션.기다림)

          TriggerDestroy();

        만약(성공) {

          //사용자 정의 성공 콜백 함수 호출

          성공(모델, 담당자);

        } 또 다른 {

          // 커스텀 콜백이 없으면 기본적으로 동기화 이벤트가 트리거됩니다.

          model.trigger('sync', 모델, resp, 옵션);

        }

      };

      // 요청에 오류가 발생하면 WrapError를 통해 오류 이벤트를 처리합니다.

      options.error = Backbone.wrapError(options.error, 모델, 옵션);

      //동기화 메소드를 통해 데이터 삭제 요청을 보냅니다.

      var xhr = (this.sync || Backbone.sync).call(this, '삭제', this, 옵션);

      // 옵션 객체에 대기 항목이 구성되어 있지 않으면 로컬 데이터를 먼저 삭제한 후 서버 데이터를 삭제하라는 요청을 보냅니다.

      // 이때, 서버 삭제 성공 여부와 상관없이 로컬 모델 데이터는 삭제된 상태입니다.

      if(!options.wait)

        TriggerDestroy();

      xhr을 반환합니다.

    },

    // 서버 인터페이스에서 모델에 해당하는 URL을 가져옵니다. save, fetch, destroy 및 기타 메소드를 호출하여 서버와 상호작용할 때 이 메소드를 사용하여 URL을 가져옵니다.

    // 생성된 URL은 "PATHINFO" 모드와 유사합니다. 서버에는 모델 작업을 위한 URL이 하나만 있습니다. 수정 및 삭제 작업의 경우 쉽게 식별할 수 있도록 모델 ID가 URL에 추가됩니다.

    // 모델에 urlRoot가 정의된 경우 서버 인터페이스는 [urlRoot/id] 형식이어야 합니다.

    // 모델이 속한 컬렉션이 url 메서드나 속성을 정의하는 경우 컬렉션에서 url 형식을 사용합니다: [collection.url/id]

    // 서버 URL에 액세스할 때 모델 ID가 URL에 추가되어 서버가 레코드를 쉽게 식별할 수 있으므로 모델의 ID는 서버 레코드와 일치해야 합니다.

    // 모델이나 컬렉션의 URL을 얻을 수 없으면 urlError 메서드가 호출되고 예외가 발생합니다.

    // 서버 인터페이스가 "PATHINFO"에 따라 구성되지 않은 경우 url 메서드를 오버로드하여 서버와 원활한 상호 작용을 구현할 수 있습니다.

    URL : 함수() {

      //서버에 해당하는 URL 경로를 정의합니다.

      var base = getValue(this, 'urlRoot') || getValue(this.collection, 'url') ||

      // 현재 모델이 클라이언트에서 새로 생성한 모델인 경우 id 속성이 없고, 서버 url이 base를 직접 사용합니다.

      if(this.isNew())

        반환 기지;

      // 현재 모델에 id 속성이 있는 경우 save 또는 destroy 메소드가 호출될 수 있으며 모델의 id가 기본에 추가됩니다.

      //다음은 base의 마지막 문자가 "/"인지, 생성된 URL 형식이 [base/id]인지 확인합니다.

      return base (base.charAt(base.length - 1) == '/' ? '' : '/') encodeURIComponent(this.id);

    },

    // 서버에서 가져온 데이터를 파싱하고 set 메서드로 파싱할 수 있는 모델 데이터를 반환하기 위해 파싱 메소드를 사용합니다.

    // 일반적으로 서버와의 원활한 연결을 구축하기 위해 서버에서 반환하는 데이터를 기반으로 구문 분석 메서드가 오버로드됩니다.

    // 서버가 반환한 데이터 구조가 set 메소드에서 요구하는 데이터 구조와 일치하지 않는 경우(예: 서버가 XML 형식의 데이터를 반환하는 경우) 변환에 구문 분석 메소드를 사용할 수 있습니다.

    구문 분석 : 함수(resp, xhr) {

      반환 응답;

    },

    // 현재 모델과 동일한 데이터로 새 모델을 생성합니다.

    복제 : 함수() {

      새로운 this.constructor(this.attributes)를 반환합니다.

    },

    // 현재 모델이 클라이언트가 생성한 새로운 모델인지 확인

    // 확인 방법은 모델에 ID 식별자가 있는지 여부에 따라 결정됩니다. 클라이언트가 만든 새 모델에는 ID 식별자가 없습니다.

    // 따라서 서버가 응답하는 모델 데이터에는 id 식별자가 포함되어야 합니다. 식별자의 속성 이름은 기본적으로 "id"로 설정됩니다. idAttribute 속성을 수정하여 식별자를 맞춤 설정할 수도 있습니다.

    isNew : 함수() {

      return this.id == null;

    },

    // 데이터가 업데이트될 때 변경 이벤트 바인딩을 트리거하는 함수

    // set 메소드 호출 시 자동으로 변경 메소드가 호출됩니다. set 메소드 호출 시 자동 구성이 지정된 경우에는 변경 메소드를 수동으로 호출해야 합니다.

    변경 : 기능(옵션) {

      // 옵션은 객체여야 합니다.

      옵션 || ( 옵션 = {});

      // 이와 관련된 로직에 문제가 있습니다._변경

      // this._changing은 메서드 끝에서 false로 설정되므로 메서드 위의 변경 변수 값은 항상 false입니다(처음은 정의되지 않음).

      // 작성자의 원래 의도는 이 변수를 사용하여 변경 메서드가 실행되었는지 여부를 나타내는 것이어야 합니다. 이 메서드는 실행 시 다른 스크립트를 차단하므로 브라우저 측의 단일 스레드 스크립트에는 의미가 없습니다.

      // 변경하면 마지막 실행 상태를 가져옵니다. 마지막 스크립트가 실행되지 않은 경우 값은 true입니다.

      var 변경 = this._changing;

      //플래그 실행을 시작합니다. 실행 중 값은 항상 true입니다. 실행 후에는 this._changing이 false로 수정됩니다.

      this._changing = true;

 

      //이 변경 사항 이외의 데이터 상태를 _pending 개체에 추가합니다.

      for(this._silent의 var 속성)

      this._pending[attr] = true;

 

      // 변경 객체에는 현재 데이터에 대해 변경 이벤트가 마지막으로 실행된 이후 변경된 모든 데이터가 포함됩니다.

      // 이전에 자동을 사용하여 변경 이벤트가 트리거되지 않은 경우 이번에는 변경 객체에 배치됩니다.

      var 변경 = _.extend({}, options.changes, this._silent);

      //_silent 객체 재설정

      this._silent = {};

      // 변경 객체를 탐색하고 각 속성에 대해 별도의 변경 이벤트를 트리거합니다.

      for(변경 사항의 var 속성) {

        // Model 객체, 속성 값, 구성 항목을 이벤트 수신 함수에 매개변수로 전달합니다.

        this.trigger('change:' attr, this, this.get(attr), options);

      }

 

      //메소드가 실행 중이면 실행을 중지합니다.

      만약(변경)

        이거 돌려줘;

 

      // 변경 이벤트를 트리거합니다. 데이터가 변경된 후 "change:property" 이벤트와 "change" 이벤트가 차례로 트리거됩니다.

      while(!_.isEmpty(this._pending)) {

        this._pending = {};

        // 변경 이벤트를 트리거하고 모델 인스턴스 및 구성 항목을 매개변수로 청취 함수에 전달합니다.

        this.trigger('change', this, options);

        // 변경된 객체의 데이터를 순회하고 변경된 데이터의 상태를 차례로 변경된 항목에서 제거합니다.

        // 이후 데이터 상태를 확인하기 위해 hasChanged를 호출하면 false(변경되지 않음)가 반환됩니다.

        for(this.changed의 var 속성) {

          if(this._pending[attr] || this._silent[attr])

            계속하다;

          //변경된 데이터의 상태를 제거합니다.

          이것을 삭제하세요.변경됨[attr];

        }

        // 변경 이벤트가 실행된 후 _previousAttributes 속성은 현재 모델의 최신 데이터 복사본을 기록합니다.

        // 따라서 데이터의 이전 상태를 가져와야 하는 경우 일반적으로 트리거된 변경 이벤트의 이전 또는 이전 속성 메서드를 통해서만 가져올 수 있습니다.

        this._previousAttributes = _.clone(this.attributes);

      }

 

      //실행 완료 플래그

      this._changing = false;

      이거 돌려줘;

    },

    // 마지막 변경 이벤트가 실행된 이후 특정 데이터가 변경되었는지 확인합니다.

    /*** 일반적으로 다음과 같이 변경 이벤트에서 이전 또는 이전 속성 메서드와 함께 사용됩니다.

     * if(model.hasChanged('attr')) {

     * var attrPrev = model.previous('attr');

     * }*/

    hasChanged : 함수(attr) {

      if(!arguments.length)

        return !_.isEmpty(this.changed);

      return _.has(this.changed, attr);

    },

    // 현재 모델의 데이터 컬렉션과 마지막 데이터에서 변경된 데이터를 가져옵니다.

    // (일반적으로 자동 속성 사용 시에는 변경 메소드가 호출되지 않으므로 변경된 속성에 데이터가 임시 저장됩니다. 마지막 데이터는 이전 속성 메소드를 통해 얻을 수 있습니다.)

    // diff 세트가 전달되면 마지막 모델 데이터가 diff 세트의 데이터와 비교되어 일치하지 않는 데이터 세트가 반환됩니다.

    // 비교 결과 차이가 없으면 false를 반환

    변경된 속성: 함수(diff) {

      // diff를 지정하지 않으면 이전 상태에서 변경된 현재 모델의 데이터 컬렉션이 반환됩니다. 이러한 데이터는 변경된 속성에 저장되어 있으므로 변경된 컬렉션의 복사본이 반환됩니다.

      if(!차이점)

        return this.hasChanged() ? _.clone(this.changed) : false;

      // 비교해야 할 diff 세트를 지정하고 마지막 데이터와 diff 세트의 비교 결과를 반환합니다.

      //이전 변수는 이전 상태의 모델 데이터를 저장합니다.

      var val, 변경됨 = false, old = this._previousAttributes;

      // diff 컬렉션을 탐색하고 각 항목을 이전 상태 컬렉션과 비교합니다.

      for(diff의 var 속성) {

        // 비교 결과가 일치하지 않는 데이터를 변경된 변수에 임시 저장

        if(_.isEqual(old[attr], ( val = diff[attr])))

          계속하다;

        (변경됨 || (변경됨 = {}))[attr] = val;

      }

      // 비교 결과를 반환

      반품이 변경되었습니다.

    },

    // 모델에 의해 발생된 변경 이벤트에서 속성이 변경되기 전의 이전 상태의 데이터를 획득하는데, 이는 일반적으로 데이터 비교나 롤백에 사용됩니다.

    // 이 메소드는 일반적으로 변경 이벤트에서 호출됩니다. 변경 이벤트가 트리거된 후 _previousAttributes 속성은 최신 데이터를 저장합니다.

    이전 : 함수(속성) {

      // attr은 이전 상태를 가져오는 데 필요한 속성 이름을 지정합니다.

      if(!arguments.length || !this._previousAttributes)

        null을 반환;

      return this._previousAttributes[attr];

    },

    // 모델이 변경 이벤트를 트리거하면 모든 속성의 이전 상태에 대한 데이터 수집을 얻습니다.

    // 이 메소드는 이전() 메소드와 유사하며 일반적으로 변경 이벤트에서 호출되며 데이터 비교 또는 롤백에 사용됩니다.

    이전 속성: function() {

      // 이전 상태의 데이터 객체를 새 객체로 복제하고 반환합니다.

      return _.clone(this._previousAttributes);

    },

    // 현재 모델이 유효한 상태인지 확인하는 것만 가능합니다.

    // 자동 변경을 사용하는 경우 *invalid* 상태가 됩니다.

    // 현재 모델의 데이터가 유효성 검사 메서드로 검증 가능한지 확인합니다. 호출하기 전에 유효성 검사 메서드가 정의되어 있는지 확인하세요.

    isValid : 함수() {

      return !this.validate(this.attributes);

    },

    // 데이터 검증 메소드는 설정, 저장, 추가 및 기타 데이터 업데이트 메소드를 호출할 때 자동으로 실행됩니다.

    // 검증에 실패하면 모델 객체의 "error" 이벤트가 발생합니다. 옵션에 오류 처리 함수가 지정되어 있으면 options.error 함수만 실행됩니다.

    // @param {Object}는 모델의 객체화된 데이터를 저장하는 데이터 모델의 속성을 나타냅니다.

    // @param {Object} 옵션 구성 항목

    // @return {Boolean} 확인에 성공하면 true를 반환하고, 실패하면 false를 반환합니다.

    _validate : 함수(속성, 옵션) {

      // set, save, add 등의 데이터 업데이트 메소드를 호출할 때 options.silent 속성을 설정하면 검증이 무시됩니다.

      // 모델에 유효성 검사 메서드가 추가되지 않은 경우 유효성 검사가 무시됩니다.

      if(options.silent || !this.validate)

        사실을 반환;

      // 객체의 모든 속성 값을 가져와 검증을 위해 검증 메소드에 넣습니다.

      //검증 방법에는 모델의 데이터 수집 및 구성 개체인 두 개의 매개 변수가 포함됩니다. 검증에 성공하면 데이터가 반환되지 않습니다(기본값은 정의되지 않음). 검증에 실패하면 오류 정보가 포함된 데이터가 반환됩니다. .

      attrs = _.extend({}, this.attributes, attrs);

      var error = this.validate(attrs, options);

      //확인 통과

      만약(!오류)

        사실을 반환;

      // 확인 실패

      // 구성 개체에 오류 오류 처리 방법이 설정된 경우 이 메서드를 호출하고 오류 데이터 및 구성 개체를 이 메서드에 전달합니다.

      if(옵션 && options.error) {

        options.error(this, 오류, 옵션);

      } 또 다른 {

        // 오류 이벤트 리스너가 모델에 바인딩된 경우 바인딩 이벤트가 트리거됩니다.

        this.trigger('error', this, error, options);

      }

      //반품 확인 실패 식별

      거짓을 반환;

    }

  });

 

  // Backbone.Collection 데이터 모델 컬렉션 관련

  //------

 

  // 컬렉션은 동일한 클래스의 일련의 데이터 모델을 저장하고 모델을 작동하기 위한 관련 메서드를 제공합니다.

  var Collection = Backbone.Collection = function(모델, 옵션) {

    //구성 객체

    옵션 || (옵션 = {});

    //구성 매개변수에서 컬렉션의 모델 클래스를 설정합니다.

    if(옵션.모델)

      this.model = 옵션.모델;

    // comparator 속성이 설정되면 컬렉션의 데이터는 comparator 메소드의 정렬 알고리즘에 따라 정렬됩니다. (add 메소드에서 자동으로 호출됩니다.)

    if(옵션.비교기)

      this.comparator = 옵션.comparator;

    //인스턴스화 시 컬렉션의 내부 상태를 재설정합니다. (첫 번째 호출은 정의 상태로 이해될 수 있습니다.)

    this._reset();

    // 사용자 정의 초기화 메소드를 호출합니다. 필요한 경우 일반적으로 초기화 메소드가 오버로드됩니다.

    this.initialize.apply(this, 인수);

    // 모델 데이터가 지정된 경우 재설정 메서드를 호출하여 컬렉션에 데이터를 추가합니다.

    // 처음 호출될 때 자동 매개변수가 설정되므로 "reset" 이벤트가 트리거되지 않습니다.

    if(모델)

      this.reset(모델, {

        침묵 : 사실,

        구문 분석 : 옵션.parse

      });

  };

  // 확장 메소드를 통해 컬렉션 클래스의 프로토타입 메소드를 정의합니다.

  _.extend(Collection.prototype, 이벤트, {

 

    // 컬렉션의 모델 클래스를 정의합니다. 모델 클래스는 Backbone.Model의 하위 클래스여야 합니다.

    // 컬렉션 관련 메소드(add, create 등) 사용 시 데이터 객체 전달이 허용됩니다. 컬렉션 메소드는 정의된 모델 클래스에 따라 해당 인스턴스를 자동으로 생성합니다.

    //컬렉션에 저장된 데이터 모델은 모두 동일한 모델 클래스의 인스턴스여야 합니다.

    모델 : 모델,

 

    // 초기화 메서드, 이 메서드는 컬렉션 인스턴스가 생성된 후 자동으로 호출됩니다.

    // 이 메서드는 일반적으로 컬렉션 클래스를 정의할 때 오버로드됩니다.

    초기화 : 함수() {

    },

    // 컬렉션에 있는 각 모델의 데이터 객체를 포함하는 배열을 반환합니다.

    toJSON : 함수(옵션) {

      // Undersocre의 map 메소드를 사용하여 컬렉션의 각 모델에 대한 toJSON 결과 배열을 구성하고 반환합니다.

      return this.map(함수(모델) {

        // 각 모델 객체의 toJSON 메소드를 차례로 호출합니다. 이 메소드는 기본적으로 모델의 데이터 객체(복사본)를 반환합니다.

        // 문자열이나 다른 형식을 반환해야 하는 경우 toJSON 메서드를 오버로드할 수 있습니다.

        return model.toJSON(옵션);

      });

    },

    //하나 이상의 모델 객체를 컬렉션에 추가합니다.

    // "add" 이벤트는 기본적으로 발생합니다. 옵션에 자동 속성이 설정된 경우 이 이벤트 발생을 끌 수 있습니다.

    // 전달된 모델은 하나 또는 일련의 모델 개체(Model 클래스의 인스턴스)일 수 있습니다. 모델 속성이 컬렉션에 설정된 경우 데이터 개체(예: {name: 'test'})가 허용됩니다. 모델이 가리키는 모델 객체로 데이터 객체를 자동으로 인스턴스화합니다.

    추가 : 기능(모델, 옵션) {

      //지역변수 정의

      var i, 인덱스, 길이, 모델, cid, id, cids = {}, ids = {}, dups = [];

      옵션 || (옵션 = {});

      // 모델은 배열이어야 하며, 하나의 모델만 전달된 경우 배열로 변환합니다.

      models = _.isArray(models) ? models.slice() : [모델];

 

      // 추가해야 할 모델 목록을 순회하는 동안 다음 작업이 수행됩니다.

      // - 데이터 객체를 모델 객체로 변환

      // - 모델과 컬렉션 사이에 참조를 설정합니다.

      // - 유효하지 않은 모델과 중복된 모델을 기록하고 나중에 필터링합니다.

      for( i = 0, 길이 = models.length; i 
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Call of Duty: Warzone 모바일 게임에서 중국어를 설정하는 방법 Call of Duty: Warzone 모바일 게임에서 중국어를 설정하는 방법 Mar 22, 2024 am 08:41 AM

Call of Duty Warzone은 새로 출시된 모바일 게임입니다. 많은 플레이어들이 이 게임의 언어를 중국어로 설정하는 방법에 대해 매우 궁금해하고 있습니다. 실제로 플레이어는 중국어 언어 팩만 다운로드하면 됩니다. 사용 후 수정하세요. 자세한 내용은 이 중국어 설정 방법 소개에서 배울 수 있습니다. 모바일 게임 Call of Duty: Warzone의 중국어 언어 설정 방법 1. 먼저 게임에 접속한 후 인터페이스 오른쪽 상단에 있는 설정 아이콘을 클릭합니다. 2. 나타나는 메뉴바에서 [다운로드] 옵션을 찾아 클릭하세요. 3. 이 페이지에서 [SIMPLIFIEDCHINESE](중국어 간체)를 선택하여 중국어 간체 설치 패키지를 다운로드합니다. 4. 설정으로 돌아가기

VSCode를 사용하여 중국어 설정: 전체 가이드 VSCode를 사용하여 중국어 설정: 전체 가이드 Mar 25, 2024 am 11:18 AM

중국어 VSCode 설정: 전체 가이드 소프트웨어 개발에서 Visual Studio Code(줄여서 VSCode)는 일반적으로 사용되는 통합 개발 환경입니다. 중국어를 사용하는 개발자의 경우 VSCode를 중국어 인터페이스로 설정하면 작업 효율성이 향상될 수 있습니다. 이 기사에서는 VSCode를 중국어 인터페이스로 설정하는 방법을 자세히 설명하고 특정 코드 예제를 제공하는 완전한 가이드를 제공합니다. 1단계: 언어 팩을 다운로드하고 설치합니다. VSCode를 연 후 왼쪽을 클릭합니다.

중국어를 표시하도록 Excel 테이블을 설정하는 방법은 무엇입니까? Excel 전환 중국어 작업 튜토리얼 중국어를 표시하도록 Excel 테이블을 설정하는 방법은 무엇입니까? Excel 전환 중국어 작업 튜토리얼 Mar 14, 2024 pm 03:28 PM

Excel 스프레드시트는 현재 많은 사람들이 사용하는 사무용 소프트웨어 중 하나입니다. 일부 사용자는 컴퓨터가 Win11 시스템이므로 중국어 인터페이스로 전환하고 싶지만 작동 방법을 모릅니다. 이 문제를 해결하기 위해 편집자는 모든 사용자의 질문에 답변하기 위해 왔습니다. 오늘의 소프트웨어 튜토리얼에서 공유된 내용을 살펴보겠습니다. Excel을 중국어로 전환하기 위한 튜토리얼: 1. 소프트웨어에 들어가서 페이지 상단 도구 모음 왼쪽에 있는 "파일" 옵션을 클릭합니다. 2. 아래 옵션 중에서 "옵션"을 선택하세요. 3. 새 인터페이스에 들어간 후 왼쪽의 '언어' 옵션을 클릭하세요.

PHP Dompdf에서 한자를 올바르게 표시하는 방법 PHP Dompdf에서 한자를 올바르게 표시하는 방법 Mar 05, 2024 pm 01:03 PM

PHPDompdf에서 중국어 문자를 올바르게 표시하는 방법 PHPDompdf를 사용하여 PDF 파일을 생성할 때 중국어 문자가 왜곡되는 문제가 발생하는 것은 일반적인 문제입니다. 이는 기본적으로 Dompdf에서 사용하는 글꼴 라이브러리에 중국어 문자 세트가 포함되어 있지 않기 때문입니다. 한자를 올바르게 표시하려면 Dompdf의 글꼴을 수동으로 설정하고 한자를 지원하는 글꼴을 선택해야 합니다. 다음은 이 문제를 해결하기 위한 몇 가지 구체적인 단계와 코드 예제입니다. 1단계: 중국어 글꼴 파일 다운로드 먼저,

PHP Dompdf에서 중국어 왜곡 문자를 수정하는 효과적인 방법 PHP Dompdf에서 중국어 왜곡 문자를 수정하는 효과적인 방법 Mar 05, 2024 pm 04:45 PM

제목: PHPDompdf에서 중국어 왜곡 문자를 복구하는 효과적인 방법 PHPDompdf를 사용하여 PDF 문서를 생성할 때 중국어 문자가 왜곡되는 것이 일반적인 문제입니다. 이 문제는 일반적으로 Dompdf가 기본적으로 중국어 문자 세트를 지원하지 않아 중국어 콘텐츠가 올바르게 표시되지 않기 때문에 발생합니다. 이 문제를 해결하려면 PHPDompdf의 중국어 왜곡 문제를 해결하는 몇 가지 효과적인 방법을 취해야 합니다. 1. 사용자 정의 글꼴 파일을 사용하십시오. Dompdf의 중국어 문자 왜곡 문제를 해결하는 효과적인 방법은 다음을 사용하는 것입니다.

wwe2k24에 중국어가 있나요? wwe2k24에 중국어가 있나요? Mar 13, 2024 pm 04:40 PM

'WWE2K24'는 비주얼콘셉츠(Visual Concepts)가 제작한 레이싱 스포츠 게임으로, 2024년 3월 9일 정식 출시됐다. 이 게임은 높은 평가를 받았으며, 많은 플레이어들이 중국어 버전이 나올지 궁금해하고 있습니다. 불행하게도 아직까지 "WWE2K24"는 중국어 버전을 출시하지 않았습니다. wwe2k24는 중국어로 제공되나요? 답변: 중국어는 현재 지원되지 않습니다. 스팀 중국 지역 WWE2K24 스탠다드 버전의 가격은 199위안, 디럭스 버전은 329위안, 기념 에디션은 395위안이다. 이 게임은 구성 요구 사항이 상대적으로 높으며 프로세서, 그래픽 카드 또는 실행 메모리 측면에서 특정 표준이 있습니다. 공식 권장 구성 및 최소 구성 소개:

Windows 7의 언어를 중국어로 설정하는 방법 Windows 7의 언어를 중국어로 설정하는 방법 Dec 21, 2023 pm 10:07 PM

일부 친구는 시스템을 설치할 때 실수로 영어로 설정했을 수 있습니다. 결과적으로 모든 인터페이스가 영어로 변경되어 이해할 수 없습니다. 실제로 제어판에서 언어를 설정할 수 있는데, 언어를 중국어로 변경하는 방법을 살펴보겠습니다. win7에서 언어를 중국어로 변경하는 방법 1. 먼저 화면 왼쪽 하단에 있는 버튼을 클릭한 다음 "제어판"을 선택합니다. 2. "시계, 언어 및 지역"에서 "Changedispaly언어"를 찾습니다. 3. " 영어'를 선택하여 드롭다운 메뉴에서 중국어 간체를 선택하세요. 4. 확인 후 "지금 로그오프"를 클릭하여 로그아웃하고 컴퓨터를 다시 시작하십시오. 5. 돌아온 후

PHP로 txt 파일을 작성할 때 중국어 왜곡 문자를 해결하기 위한 팁 PHP로 txt 파일을 작성할 때 중국어 왜곡 문자를 해결하기 위한 팁 Mar 27, 2024 pm 01:18 PM

PHP로 작성한 중국어 왜곡 문자를 txt 파일로 해결하는 방법 인터넷의 급속한 발전과 함께 널리 사용되는 프로그래밍 언어인 PHP를 점점 더 많은 개발자가 사용하고 있습니다. PHP 개발에서는 중국어 내용이 포함된 txt 파일을 포함하여 텍스트 파일을 읽고 써야 하는 경우가 많습니다. 그러나 인코딩 형식 문제로 인해 때때로 작성된 중국어가 깨져서 나타날 수 있습니다. 이 기사에서는 PHP로 txt 파일에 작성된 중국어 문자 왜곡 문제를 해결하는 몇 가지 기술을 소개하고 구체적인 코드 예제를 제공합니다. PHP, 텍스트의 문제 분석

See all articles