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

underscore, но я изменил правила шаблона, чтобы использовать {{}} – SkyeBoniwell

+1

Сортировка вне темы, но если ваша использующая Backbone версия> 0.9.0. Вы можете использовать 'this. $ El' вместо' $ (this.el) 'для ссылки на ваш элемент вида. Кроме того, вы можете использовать' this.model.on ('change', this.render, this) 'для предоставления контекста для вашего обратного вызова.' bind' - это псевдоним для 'on'. – 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

Мой код зафиксирует событие и вызовет его. В этот момент это так же просто, как вставка html в ваш шаблон с помощью jQuery.append() – josephmisiti

1

Сначала вы построили модель, содержащую данные.

Тогда внутри вида, вы бы компилировать шаблон первого

Используйте _.template компилировать шаблон

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())); 
     } 

Тогда внутри рендер зрения вы бы передать в модели вместе с скомпилированным шаблоном , который будет заполнен данными внутри модели.

+0

О, хорошо, поэтому я получаю данные в своей модели. Но как насчет события с кнопками? Мне не нужно это сейчас? Спасибо – SkyeBoniwell

+1

@ 999cm999 .. Создайте хэш событий и добавьте в него событие. Должно быть хорошо .. И я считаю, что у вас может быть 1 кнопка для каждого вида формы. Поэтому используйте 'class', а не идентификатор' id' как идентификатор, должны быть уникальными .. Проверьте обновленный пост –