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.