2014-01-07 1 views
1

ID가있는 템플릿 html로 링크 된 마리오네트 뷰의 다중 뷰 인스턴스를 만들면 이러한 뷰의 여러 인스턴스에 대해 복제됩니다.Backbone/Marionette보기 인스턴스를 사용할 때 동일한 ID를 가진 여러 DOM 요소를 피할 수 있습니까?

올바르게 작동하는 동안 구조적으로 올바른 방법을 사용해야한다고 생각합니다.

예제 코드는 아래와 같습니다.

Template: 
<script id="myTemplate" type="text/template"> 
    <div id="myDiv"> 
     <input type="text" id="myText"/> 
     <input type="button" id="myBtn" value="Click me!"/> 
    </div> 
</script> 
View: 
MyView = Backbone.Marionette.ItemView.extend({ 
    template: '#myTemplate', 
    events: { 
     'click #myBtn' : 'myFunc'  //Correctly identifies its own 'myBtn' 
    }, 
    myFunc : function() { 
     alert($('myText').val());  //Again, picks own 'myText' 
    } 
}); 
var v1= new MyView(); 
v1.render(); 
var v2= new MyView(); 
v2.render();  //Duplicate IDs now present in DOM 

DOM 요소와 ID가 고유해야합니다. 모델을이보기에 연결하는 경우에도 이러한 DOM 요소를 식별 할 수있는 방법이 필요합니다.

ID를 복제하지 않고이를 수행하는 올바른 방법은 무엇입니까? 당신이

var v1= new MyView({ id: "view" + number}); 
v1.render(); 

다음 :

템플릿 :

<script id="myTemplate" type="text/template"> 
    <input type="text" class="js-myText"/> 
    <input type="button" class="js-myBtn" value="Click me!"/> 
</script> 

보기 정의 :

MyView = Backbone.Marionette.ItemView.extend({ 
    template: '#myTemplate', 
    events: { 
     'click #myBtn' : 'myFunc'  //Correctly identifies its own 'myBtn' 
    }, 
    myFunc : function() { 
     alert($('myText').val());  //Again, picks own 'myText' 
    } 
}); 

Instanciation을 만들 때

답변

0

, 당신은 사용할 수 있습니다

  1. 밑줄의 uniqueId 방법은 내부의 각 DOM 요소에 대한 고유 ID를 생성하는 보기 : <input type="text" id= <%= _.uniqueId("myText_") %> /> 이것은 ID가 중복되지 않도록합니다. 그러나 이러한 ID로 요소를 식별해야하는 경우에는별로 도움이되지 않습니다.

  2. 마리오네트의 당신은 템플릿 내부에서 도우미 기능을 사용할 수 있도록 TemplateHelpers :

    //Define this inside your view: 
        templateHelpers: function() { 
         var that = this; 
         return { 
         getIdSuffix : function() { return that.idSuffix; } 
          /*Where idSuffix is passed to the view during instantiation 
           and assigned to this.idSuffix */ 
         }; 
        } 
    
    //In the template: 
        <input type="text" id= <%= "myText_" + getIdSuffix() %> /> 
    
  3. 이 는 이제 DOM ID를 당신이 무슨 실행하기 전에 알아야

    는, 치료가 동일하게 제공하지 않도록 제공한다

idSuffix를 2 개 이상의 뷰 인스턴스에 건네줍니다.

+0

감사합니다. 이것은 동일한 템플리트에서 작동하는 뷰의 다중 인스턴스에 대해서도 모델에 정적으로 바인딩하는 동안 별도의 고유 한 ID를 생성하는 데 유용해야합니다. 이렇게하면 DOM의 고유 속성을 위해 클래스 속성을 사용하도록 강요하지 않을 것입니다 (이 속성은 사용하도록 설계되지 않았습니다). 이것은 확실히 조사하고 채택하는 가치가있는 것 같습니다. – class

+0

jQueryUI의 탭은 최근 div 항목에 대한 ID를 요구하는 시나리오 중 하나입니다. 탭보기를 인스턴스화하면 이러한 ID가 페이지에 복제되어 HTML이 유효하지 않게됩니다. 이 솔루션은이 경우에 도움이됩니다. – Nemisha

1

는 그냥보기로 ID를 전달 동적 인 01을 제공 할 수있다. 조회수 값(예 : 모델 ID를 사용하여).

그렇다면 마리오넷을 사용할 때 render으로 전화 할 필요가 없습니다. 지역 내에서 show보기를 사용해야합니다. 내 Marionette bookfree sample을 보시면 속도를 높일 수 있습니다. 당신이 아무도 실수로보기를 내부 클래스 이름을 중복 없는지 확인하는 고유 ID를 위해 이동해야하는 경우

+0

미안 내가하지 않은 경우 나 자신을 더 일찍 청산하라. 내가 걱정하는 것은 "myText"id가 dom 자식 요소이며 컨테이너 요소가 사용자가 지정한대로 동적으로 생성 된 ID를 가질 때에도 뷰 내부에서 반복됩니다. "mytText"가있는 두 개 (또는 그 이상)의 뷰 인스턴스를 하위 요소의 ID로 처리하는 방법은 무엇입니까? – class

+0

그건 내 대답과 함께 일어나지 않을 것입니다 : 템플릿에'id' 속성이없고, 당신이 다른 ID를 제공 할 때마다 (예 : "view1", "view2") 뷰를 인스턴스화 할 때마다. 다른 ID가 필요한 경우 분명히 다른 id 값을 직접 제공해야합니다. HTML'id' 속성이 필요 없다면 간단히 제거하십시오 (백본은 뷰에서 그것을 필요로하지 않습니다). 이 점이 더 명확 해지는가? –

+0

저에게 인내심을 가져 주셔서 감사합니다. 예를 들어 ID가 "myText"이고 ID가 "myBtn"인 첫 번째 텍스트 상자와 같이 DOM 요소에 대해 템플릿에 제공된 HTML ID가 걱정됩니다 두 번째 단추. "view1"및 "view2"의 경우 텍스트 상자 및 단추 ID는 이제 복제됩니다. "view1"의 텍스트 상자와 "view2"의 텍스트 상자로 모델을 연결하는 것이 필요하다고 생각합니다. – class

0

간단히 말해서 고유하지 않은 경우 id을 사용하지 마십시오. 클래스를 사용하거나 요소를 식별하는 다른 방법을 사용하십시오.

당신은 미친 취성에 이르기까지, 당신이 원하는 요소를 찾을 수있는 jQuery를 선택기를 사용할 수 있습니다

this.$('div > input:first'); // don't actually do this!

을 의미 더 느리지 만에 :

this.$('[data-element-type="some-text-box-descriptive-name"]');

하지만 실제로는 클래스를 사용하는 것이 가장 좋습니다. 클래스가 요소이기 때문에 요소의 유형을 식별하기 때문입니다. (이 경우) 나는 테이너가 템플릿에서 클래스를 변경하지 모를 수도 있음을 볼 수있다, 그래서 데이터 속성도 어쩌면 허용, 또는 수 있습니다 :

this.$('input[type=text]');

관련 문제