1

backbone.js 및 underscore.js를 사용하여 페이지를 만들려고합니다. 페이지에 버튼이 있으면 그 버튼을 누르면 내가 정의한 템플릿을 사용하여 페이지의 빈 태그에 양식의 내용을 추가합니다. 양식 데이터가 어디로 가야backbone.js가있는 밑줄 템플릿 사용

<div id="playView"></div> 
<input type="button" id="addQuestion" value="Add Question" /> 

가 여기 내 템플릿입니다 :

는 여기에 버튼을 누른 후 템플릿 물건이 가고 싶은 내 빈 태그의

<script id="viewTemplate" type="text/template"> 
    <div id="stemView">{{ Stem }}</div> 
    <label for="answer1"> a)</label><div>{{ answer1View }}</div> 
    <label for="answer2"> b)</label><div>{{ answer2View }}</div> 
    <label for="answer3"> c)</label><div>{{ answer3View }}</div> 
    <label for="answer4"> d)</label><div>{{ answer4View }}</div> 
</script> 

을 그리고 여기 폼의 사용자가 작성해야 할 내용은 다음과 같습니다.

<form> 
    <textarea id="stem"><textarea> 
    <textarea id="answer1"></textarea> 
    <textarea id="answer2"></textarea> 
    <textarea id="answer3"></textarea> 
    <textarea id="answer4"></textarea> 
</form> 

여기에는 관련 backbone.js 코드가 나와 있습니다. 제 질문은, 제가이 행사에서 무엇을합니까? 양식에서 데이터를 가져온 다음 viewTemplate으로 가져온 다음 비어있는 div 태그 (playView)에 어떻게 가져 옵니까?

wizard.PlayView = Backbone.View.extend({ 
    initialize: function() { 
     this.model.bind('change', _.bind(this.render, this)); 
    }, 
    el: '#playView', 

    events: { 
     'click button#addQuestion': 'addQuestion' 
    } 
    addQuestion: function() { 
     $(this.el).append(); 
    } 
}); 
+1

사용중인 템플릿 라이브러리 무엇입니까? 구문은 핸들 바처럼 보인다 –

+0

밑줄이 붙지 만 {{}} – SkyeBoniwell

+1

토픽 정렬이 가능하지만 백본 버전이 0.9 이상인 경우'$ this.el '대신'this. $ el'을 사용할 수 있습니다.)'를 사용하여 뷰 요소를 참조 할 수 있으며, 'this.model.on ('change ', this.render, this)'를 사용하여 콜백의 컨텍스트를 제공 할 수 있습니다. – fbynite

답변

1

, 당신은 지금이 설정을 가지고있는 식으로, 당신은

events: { 
     'click button#addQuestion': 'addQuestion' 
    } 

를 트리거 할 수 없습니다. 따라서이 문제를 해결하려면 검은 뼈 템플릿이 페이지의 단추를 렌더링 한 다음 단추를 클릭하는 소리를 듣습니다. 버튼을 클릭하면, 당신은 HTML 페이지에 포함되어있는 (질문 템플릿을로드하고 현재의 백본 템플릿에 그것을 삽입합니다.

<script id="viewTemplate" type="text/template"> 
    <div id="stemView">{{ Stem }}</div> 
    <label for="answer1"> a)</label><div>{{ answer1View }}</div> 
    <label for="answer2"> b)</label><div>{{ answer2View }}</div> 
    <label for="answer3"> c)</label><div>{{ answer3View }}</div> 
    <label for="answer4"> d)</label><div>{{ answer4View }}</div> 
</script> 

<script id="mainTemplate" type="text/template"> 
    <input type="button" id="addQuestion" value="Add Question" /> 
</script> 


wizard.PlayView = Backbone.View.extend({ 
    initialize: function() { 
     this.model.bind('change', _.bind(this.render, this)); 
    }, 

el: '#playView', 

template : _.template($('#mainTemplate').html()) 

events: { 
    'click button#addQuestion': 'addQuestion' 
} 

addQuestion: function() { 
    var t = _.template($('#stemTemplate').html(); 
    $(this.el).append(t(this.model.toJSON())); 
} 

render: function() { 
      $(this.el).append(this.template(this.model.toJSON())); 
     } 

}); 
+0

코드를 보내 주셔서 감사합니다. 그래서 코드가 내 이벤트를 수정하겠습니까? 따라서 'addQuestion'버튼을 누를 때마다 viewTemplate이 폼의 데이터로 채워지고 playView가 채워집니다. 감사합니다 – SkyeBoniwell

+1

내 코드가 이벤트를 수정하고 트리거합니다. 이 시점에서 jQuery.append()로 템플릿에 html을 삽입하는 것만 큼 간단합니다. – josephmisiti

1

먼저 데이터가 포함 된 모델을 작성하십시오.

그런 다음 내부보기, 당신은 당신이 컴파일 된 템플릿과 함께 모델에 통과 할 뷰의 렌더링 안에 그런 다음 템플릿을

wizard.PlayView = Backbone.View.extend({ 
     template : _.template($('#viewTemplate').html()) 
     initialize: function() { 
     // Use listenTo to bind events instead of directly 
     // listening on the model 
      this.listenTo(this.model, 'change', this.render); 
     }, 
     events: { 
      'click .addQuestion': 'addQuestion' 
     }, 
     addQuestion: function(e) { 
      var $target = $(e.target); 
      // Your logic here 
     }, 
     render: function() { 
      $(this.el).append(this.template(this.model.toJSON())); 
     } 

를 컴파일 할

사용 _.template 먼저 템플릿을 컴파일 할 것 모델 내부의 데이터로 채워질 것입니다. 내가 제대로 이해하고있는 경우 입력 태그는 백본 템플릿에 있어야하기 때문에

+0

오케이, 내 모델에서 데이터를 얻을 수 있습니다.하지만 버튼 이벤트는 무엇입니까? 지금 필요하지 않습니까? 감사합니다. – SkyeBoniwell

+1

@ 999cm999 .. 이벤트 해시 만들기 이벤트를 추가하십시오. 잘해야합니다. 그리고 당신이 각 폼보기에 대해 1 개의 버튼을 가지고 있다고 생각합니다. 따라서 ID가 고유해야하므로'id' 대신'class'를 사용하십시오. 업데이트 된 게시물 확인 –