Backbone.View "el"혼란


97

뷰는 어떻게 el처리 되어야 합니까? 설정해야합니다. 그렇지 않으면 이벤트가 발생하지 않습니다 ( 여기 참조 ).

그러나 이미 페이지에있는 요소 여야합니까? 내 앱에서 (jQuery Templates) 템플릿을 Fancybox로 렌더링합니다. el그 경우에는 무엇을해야 합니까?


11
나는 생각했다 – 나는 그 el일을 만지작 거리는 유일한 사람 이다.
— Yugal Jindle 2013 년

el입니다 gf. 아무도 그것들을 완전히 이해할 수 없습니다.
— Mahi

답변:


121

보기 el은 모든 이벤트 바인딩이 발생하는 곳입니다. 사용할 필요는 없지만 백본이 이벤트를 발생 시키려면 el에서 렌더링 작업을 수행해야합니다. 보기 el은 DOM 요소이지만 기존 요소 일 필요는 없습니다. 현재 페이지에서 하나를 가져 오지 않으면 생성되지만 어떤 작업을 수행하는 것을 보려면 페이지에 삽입해야합니다.

예 : 개별 항목을 생성하는보기가 있습니다.

window.ItemView = Backbone.View.extend({
    tagName: "li", //this defaults to div if you don't declare it.
    template: _.template("<p><%= someModelKey %></p>"),
    events: {
         //this event will be attached to the model elements in
         //the el of every view inserted by AppView below
        "click": "someFunctionThatDoesSomething"
    },
    initialize: function () { 
        _.bindAll(this, "render");
        this.render();
    },
    render: function () {
        this.el.innerHTML = this.template(this.model.toJSON());
        return this;
    }
});
window.AppView = Backbone.View.extend({
    el: $("#someElementID"), //Here we actually grab a pre-existing element
    initialize: function () { 
        _.bindAll(this, "render");
        this.render(new myModel());
    },
    render: function (item) { 
        var view = new ItemView({ model: item });
        this.el.append(view.render().el);
    }
});

첫 번째보기는 목록 항목을 만들고 두 번째보기는 실제로 항목을 페이지에 배치합니다. 나는 이것이 backbone.js 사이트 의 ToDo 예제 에서 일어나는 것과 매우 유사하다고 생각합니다 . 나는 관습이 당신에게 콘텐츠를 엘로 렌더링하는 것이라고 생각합니다. 따라서 el은 템플릿 콘텐츠를 배치하기위한 랜딩 장소 또는 컨테이너 역할을합니다. 그런 다음 Backbone은 이벤트를 내부의 모델 데이터에 바인딩합니다.

당신이보기를 만들 때 사용하는 4 가지 방법으로 엘을 조작 할 수 있습니다 el:, tagName:, className:,와 id:. 이들 중 어느 것도 선언되지 않으면 el ​​기본값은 id 또는 클래스가없는 div입니다. 이 시점에서 페이지와도 연결되지 않습니다. tagName을 사용하여 태그를 다른 것으로 변경할 수 있습니다 (예 : tagName: "li"는 el of를 제공합니다 <li></li>). el의 id와 class도 마찬가지로 설정할 수 있습니다. 여전히 el은 페이지의 일부가 아닙니다. el 속성을 사용하면 el 객체를 매우 미세하게 조작 할 수 있습니다. 대부분의 경우 나는el: $("someElementInThePage")실제로보기에서 el에 수행하는 모든 조작을 현재 페이지에 바인딩합니다. 그렇지 않으면보기에서 수행 한 모든 노력이 페이지에 표시되도록하려면보기의 다른 위치 (아마도 렌더링)에 페이지를 삽입 / 추가해야합니다. 나는 el을 당신의 모든 관점이 조작하는 컨테이너라고 생각하고 싶습니다.


설명과 예제에 감사드립니다! 특정 상황에서 el이 무엇을해야하는지 항상 명확하지 않으며 개발자는 이에 대해 "느낌"을 가져야한다고 생각합니다. 귀하의 설명이 확실히 도움이되었습니다! 그러나 한 가지 질문은 ItemView에서 el을 정의하지 않지만 render 함수에서 액세스한다는 것입니다. 작동할까요? 명시 적으로 정의하지 않으면 일종의 기본 el이 있습니까?
— Manuel Meurer 2011

3
기본적으로 el은 ID 나 클래스가없는 "div"태그입니다. 페이지 DOM에 바인딩되지 않은 DOM 개체입니다. 일반적으로 렌더링 기능 또는 상위 뷰의 렌더링 기능에서 페이지에 삽입 / 추가합니다.
— LeRoy 2011

el을 정의하는 속성에 대한 설명으로 내 대답을 업데이트했습니다.
— LeRoy 2011

5
el : $ ( "# someElementID")를 사용하여 기존 요소를 잡는 유일한 문제는 뷰가 예상보다 더 많이 알고있어 재사용하기 어렵다는 것입니다. "DOM에서 뷰 분리 ..."참조 coenraets.org/blog/2012/01/…
— Scott Coates

@scoarescoare 인스턴스화에 el 속성을 추가하기 때문에 뷰 자체는 실제로 필요한 것보다 더 많이 알지 못하므로 모듈 식으로 유지되며 전달하려는 $ (el)을 수락 할 수 있습니다. 그래서 이것은 정말 재사용이 가능합니다.
— Metagrapher

6

지금은 조금 늙었지만 나도 혼란스러워서 여기에 오는 다른 사람들에게이 바이올린이 도움이 될 수 있습니다-http: //jsfiddle.net/hRndn/2/

var MyView = Backbone.View.extend({

    events: {
        "click .btn" : "sayHello",
    },

    sayHello : function() {
        alert("Hello");
    },


    render : function() {
        this.$el.html("<input type='button' class='btn' value='Say Hello'></input>");

    }
});

$(function() {
    myView = new MyView({el:"#parent_id"});
    myView.render();
});

나는이 모델을 따랐고 그렇지 않았 으면 좋겠다. 뷰를 파괴하고 바인딩을 제거하려면 백본 규칙은 view.remove ()입니다. 그러면 $ el이 파괴되고 DOM에서 제거되므로 뷰를 다시 표시해야 할 때 $ el이 존재하지 않습니다.
— JJ

@Marionette와 같은 복합 아키텍처를 사용하는 경우 무엇을 표시합니다 .... 여전히 view 's el이 필요합니까?
— afr0

링크가 있어야합니다 귀하의 바이올린 코드는 작동하지 않습니다 jsfiddle.net/hRndn
— 이지

@Mahi 네 맞아요. 아마도 잘못된 링크를 붙여 넣었을 것입니다. 이 사람은 작동합니다 jsfiddle.net/hRndn/127
— 이지에게

1

'el'이 뷰의 변경을 트리거하는 이벤트가있는 하위 요소를 포함하는 요소를 참조하도록합니다. "body"태그만큼 넓을 수 있습니다.


흠, 그것도 정말 명확하지 않습니다. 대부분의 경우 뷰의 변경을 유발할 수있는 요소는 뷰가 렌더링하는 템플릿 내부에 있으므로 렌더링되기 전에 이러한 요소는 아직 존재하지 않습니다.
— Manuel Meurer 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.