При использовании 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() в моих шаблонах?
«хит для клонирования»? Вы думаете, что вызов 'get' является бесплатным? –
@muistooshort - бесплатно? нет. 'Get()' does 'возвращает this.attributes [attr];'. Итак, поиск массива происходит быстрее, чем клонирование массива? Да - с точки зрения ресурса и времени, но это не соответствует моей точке. Вызов 'toJSON()' явно встроен в общее мышление сообщества. Мне любопытно, почему. – EBarr
«Повторные вызовы функций и обращения к объектам» по сравнению с «одним клоном и повторным доступом к объектам», и я не вижу результатов тестов, поэтому ваш * Да * является просто мнением (как и все ответы, поэтому «нет» конструктивного "голосования). Не каждое представление будет прямым отображением модели или коллекции, 'toJSON' является более гибким и уменьшает шум в вашем шаблоне. –