2012-04-25 4 views
7

При использовании backbone.js и встроенного шаблона шаблонов в подчеркивании я заметил, что большинство примеров вызывает model.ToJSON() при рендеринге вместо того, чтобы просто пропустить model. Я понимаю, что мой шаблон должен будет изменить способ получения данных.Магистральный/Подчеркивающий шаблон - при рендеринге почему звоните в JSON?

Мне интересно, почему & какую выгоду мы получаем от toJSON()?

Типичный пример

В типичном примере model.toJSON() вызывается при визуализации. Обратите внимание, что для краткости я помещаю шаблон в виде строкового литерала.

ToDoItemView = Backbone.View.extend({ 
    /* other viewey stuff */ 
    template : _.template('<li><%=ToDoNote%></li>'), 
    render : function() {  
        var out= this.template(this.model.toJSON()); //<--JSON 
        $(this.el).html(out) } 
        return this; 
       } 
}); //end view 

Альтернативный метод

Я вырыл через позвоночник 0.9.2 & подчеркивают 1.3.3 код. В позвоночнике заметили, что model.toJSON() выполняет следующие действия: _.clone(this.attributes). Внутри механизма визуализации шаблона мой скомпилированный шаблон называет переданные данные obj.

После просмотра этих фрагментов я понял, что клонирование атрибутов не требуется. Вместо этого я могу напрямую передать свою модель (хотя и с некоторыми изменениями синтаксиса в шаблоне). Что-то вроде ...

ToDoItemView = Backbone.View.extend({ 
    /* other viewey stuff */ 
    template : _.template('<li><%=obj.get('ToDoNote')%></li>'), //<--notice GET() 
    render : function() {  
        var out= this.template(this.model); //<-- look ma no json 
        $(this.el).html(result) } 
        return this; 
       } 
}); //end view 

Глядя на двух примерах, единственная причина, я могу придумать, чтобы назвать toJSON являются:

  • защитить данные модели от гнусного зрения
  • вид локально изменяет данные (не очень хорошая идея, на мой взгляд),
  • вид необходим доступ к значениям, используя массив/строка синтаксиса (obj[ namepart + someindex])

Мой вопрос сводится к: почему я должен позвонить toJSON() и принять хитов за клонирование свойств, а не просто использовать get() в моих шаблонах?

+0

«хит для клонирования»? Вы думаете, что вызов 'get' является бесплатным? –

+0

@muistooshort - бесплатно? нет. 'Get()' does 'возвращает this.attributes [attr];'. Итак, поиск массива происходит быстрее, чем клонирование массива? Да - с точки зрения ресурса и времени, но это не соответствует моей точке. Вызов 'toJSON()' явно встроен в общее мышление сообщества. Мне любопытно, почему. – EBarr

+0

«Повторные вызовы функций и обращения к объектам» по сравнению с «одним клоном и повторным доступом к объектам», и я не вижу результатов тестов, поэтому ваш * Да * является просто мнением (как и все ответы, поэтому «нет» конструктивного "голосования). Не каждое представление будет прямым отображением модели или коллекции, 'toJSON' является более гибким и уменьшает шум в вашем шаблоне. –

ответ

12

Может быть, следующий смысл:

  1. Интерполирующие вместо оценки является большая стоимость, чтобы взять. Таким образом, ваша версия шаблона равна на самом деле намного медленнее, чем вызов toJSon() и с использованием оценки.

  2. Логика относится к видам не шаблонов. Введение js-кода (и необходимость интерполяции) в шаблонах должно выполняться только при необходимости.

  3. Можно утверждать, что вы должны пройти model.attributes вместо model.toJSON(), избегая клонирования. Я предполагаю, что причина не в том, чтобы не позволить шаблону изменять атрибуты модели.Кроме того, вы, возможно, как правило, хотят, чтобы увеличить результат model.toJSON() с другими вещами, которые, очевидно, вы не хотите делать на model.attributes

+0

Хорошо сказано. Делает большой смысл. – EBarr

+2

Следует отметить, что использование 'model.toJSON()' рекомендуется для представлений ... это для сериализации модели для синхронизации, а не для рендеринга. Вы должны передать 'model.attributes', как вы предложили. https://github.com/jashkenas/backbone/issues/2134 – Cobby

+0

Даже использование 'toJSON()' или '_.clone()' может не полностью препятствовать изменению шаблона атрибутов модели, потому что метод clone создает «мелкую -копированный клон объекта. Любые вложенные объекты или массивы будут скопированы по ссылке, а не дублированы ». (http://underscorejs.org/#clone) Итак, я рекомендую использовать 'model.attributes', но предупреждаю, что вы не должны вносить изменения в модель из шаблона в любом случае. – gfullam

2

Вероятная причина заключается в том, что разработчики Backbone.js позволили вам использовать любой желаемый шаблонный движок, и многие шаблоны двигателей работают с простыми объектами javascript, не Магистральные модели.

+1

Хорошая точка. Хотя, я специально говорю о том, почему/почему - не выбирать эту стратегию * для шаблона подчеркивания *. – EBarr

Смежные вопросы