2015-09-29 1 views
0

Я заметил, что марионетка очень не склонна к свободе, так как далеко продвигается свобода, которую они дают вам, чтобы выбрать способ визуализации данных. Похоже, что есть много способов изначально делают шаблон с пользовательскими даннымиserializeData function vs Marionette.renderer для пользовательских данных

Вернувшиеся шаблон с данными:

template: function() { 
    var myTemplate = $('.someTemplate') 
    return _.template(myTemplate.html())({some: data}); 
} 

Очень аналогично:

render: function() { 
     var template = this.getTemplate(); 
     var html = Marionette.Renderer.render(template, { 
      model: this.model.toJSON(), 
      customData: this.customData 
     }); 

     this.$el.html(html); 
    } 

Serialize данные:

serializeData : function() { 
    var customData = {some: 'data'}; 
    var model = this.model.toJSON() 
    return _.extend(customData, model); 
} 

Я видел много людей в разных вариантах использования кода первого и второй. Я лично предпочитаю использовать serializeData, но любопытно: есть ли преимущество или прецедент, когда было бы целесообразно использовать первые два метода вместо serializeData?

ответ

2

Первый случай неэффективен - вы перекомпилируете шаблон каждый раз, когда хотите рендерить.

В любом случае, ваш прецедент - это именно то, почему у Марионетки templateHelpers. Его наиболее сжатый способ предоставить дополнительные данные шаблону, а также передавать сериализованную модель.

Так можно было бы написать:

templateHelpers : function() { return {some: 'data'}; }

Или если его просто статический материал:

templateHelpers: {some: 'data'}

Больше примеров о том, как использовать его here.

+0

В чем преимущества использования templateHelpers vs serializeData? – Yahkob

+0

serializeData - это внутренний метод Marionette, который дает различные выходные данные для коллекции и модели. Вы можете увидеть его реализацию здесь: https://github.com/marionettejs/backbone.marionette/blob/master/src/item-view.js#L22 Вот почему я люблю оставлять его в покое. Это только вопрос конвенции. – Paulius

+0

Согласованный, 'templateHelpers' должен быть стандартным подходом. @Yahkob, я немного написал о различии в [этом ответе] (http://stackoverflow.com/a/32232761/2395796). –

1

Я думаю, что это все о изучении естественного поведения этих вещей. Backbone View render по умолчанию является пустой функцией. Marionette ItemView render расширяет Backbone's с this code.

  1. Он принимает шаблон, getTemplate метода, по умолчанию он дает то, что хранится в template опции. Вы можете переопределить getTemplate, если хотите выбрать один из нескольких шаблонов.
  2. Затем он собирает данные, необходимые для визуализации путем запуска serializeData и расширения его с помощью templateHelpers. Первый по умолчанию возвращает вашу модель или коллекцию результат toJSON, там вы можете подготовить свои данные каким-то образом к каждому рендерингу. Второй - для помощников, которые будут вычисляться (если они являются функциями), если это необходимо в шаблоне.
  3. Шаблон и данные затем перейдите к Marionette.Renderer, где по умолчанию происходит только return template(data). И тогда результат может быть прикреплен к элементу вида.