2015-05-12 3 views
2

Я использую Handlebars с Backbone и Marionette. Я собираю шаблоны Handlebars и сохраняю их в объекте, на который можно ссылаться определениями. Я использую LayoutView и регионы для отображения различных элементов, которые мне нужны в пользовательском интерфейсе.Передача переменных в шаблон Handlebars при рендеринге Marionette/Backbone View

Что я хочу сделать, это передать (логические) переменные в представление так, чтобы Handlebars принимало решения (через вспомогательный блок {{#if varName}}) о том, что делать. Для ясности я не хочу упорствовать в этих данных, поэтому я бы действительно не сделал их частью модели, которую я передаю, чтобы ее можно было визуализировать.

Так что я делаю определение Backbone.Model и Marionette.ItemView как обычно, и пытаюсь передать в дополнительном переменных через Initialize:

var newUser = new app.UserView({ 
    model: new app.UserModel(), 
    initialize: function(){ 
    this.isNewDoc = true 
    } 
}); 
// display the view in a region using app.regions.maun.show(newUser); 
// ...etc. 

То, что я хочу, чтобы иметь возможность пройти и могут ссылаться на переменные, такие как isNewDoc в шаблоне Handlebars, в идеале через {{#if isNewDoc}}...{{/if}}.

Я пробовал различные перестановки для строки this.isNewDoc = true, такой как isNewDoc: true, но я никуда не денусь. Что я делаю не так?

ответ

3

Я переопределяю метод serializeData, когда хочу это сделать. Вы также можете сделать это, переопределив метод toJSON в модели, но, как вы отметите, он будет отправлен на сервер при сохранении модели. Поскольку это рассчитанные атрибуты и не постоянные атрибуты, то я не люблю отправлять их на сервер. Пример приведен ниже:

var newUser = new app.UserView({ 

    model: new app.UserModel(), 

    serializeData: function() { 
    return _.extend({ 
     isNewDoc: true 
    }, this.model.toJSON()); 
    } 
}); 
0

@Tyler Мариен, я проверил, что и, может быть, это хорошо работает для ванильного Backbone.View, но для Marionette.ItemView это не :(

Однако ваш предложение началось с того, что я изучил методы на Marionette.ItemView под названием serializeData, а затем идея сериализации данных является общей, и это, в свою очередь, вернуло меня к документации Marionette. Скорее всего, мне следовало бы более внимательно прочитать в первую очередь :)

Хорошая новость заключается в том, что View.templateHelpers, похоже, делают именно то, что я хочу - проверьте http://marionettejs.com/docs/marionette.view.html#viewtemplatehelpers - и View.mergeOptions также кажутся применимыми. Мой ключевой вынос: помните RTFM.

+0

serializeData - метод, специфичный для [Marionette.ItemView] (http://marionettejs.com/docs/v2.4.1/marionette.itemview.html#itemview-serializedata), поэтому он определенно будет работать. templateHelpers может быть лучшим решением для того, что вы делаете, хотя и не тем, что я использовал, поэтому благодарим вас за это. –