backbone.js с backgrid.js для заполнения JSON
Я использую backgrid.js с backbone.js. Я пытаюсь заполнить JSON (список пользователей) в backgrid. Ниже мой JSON,
[{"name": "kumnar", "emailId": "kumar@xxx.com", "location":{"name":"ABC Inc.", "провинция":"CA"} }]
Я могу получить доступ к имени и emailId, как показано ниже,
var User = Backbone.Model.extend ({}); var User = Backbone.Collection.extend ({ модель: пользователь, url: 'https://localhost:8181/server/rest/user', }); var users = new User(); столбцы var = [{ имя: "loginId", ярлык: "Имя", ячейка: "строка" }, { имя: "emailId", ярлык: "E-mail Id", ячейка: "строка" } ]; var grid = новая Backgrid.Grid({ столбцы: столбцы, коллекция: пользователи });. $("# Сетки результат") добавить (. Grid.render () $ эш); userEntities.fetch();
У меня вопрос, как мне добавить столбец для отображения location.name?
Я указал location.name в свойстве name столбцов, но оно не работает. { name: "location.name", метка: "E-mail Id", ячейка: "строка"}
Спасибо
2 ответа
И магистральные, и backgrid в настоящее время не предлагают никакой поддержки для вложенных атрибутов модели, хотя в настоящее время существует ряд заявок. Чтобы правильно отобразить информацию о местоположениях, вы можете либо превратить объект местоположений в строку на сервере и использовать строковую ячейку в backgrid, либо вы можете попытаться указать собственную реализацию ячейки для столбца местоположений.
Кроме того, вы можете попробовать backbone-deep-model, так как он поддерживает синтаксис пути, который вы ищете. Я не пробовал раньше, но если это работает, вы можете просто создать 2 строковых столбца с именем location.name
а также location.province
соответственно.
Расширить Cell очень просто (или любое из существующих расширений, таких как StringCell). Вот начало для вас:
var DeepstringCell = Backgrid.DeepstringCell = StringCell.extend({
render: function () {
this.$el.empty();
var modelDepth = this.column.get("name").split(".");
var lastValue = this.model;
for (var i = 0;i<modelDepth.length;i++) {
lastValue = lastValue.get(modelDepth[i]);
}
this.$el.text(this.formatter.fromRaw(lastValue));
this.delegateEvents();
return this;
},
});
В этом примере вы использовали бы "глубокую строку" вместо "строка" для атрибута "ячейка" вашего столбца. Расширьте его, чтобы использовать другой форматтер (например, EmailFormatter), если вы хотите повторно использовать встроенные форматеры вместе с глубокой поддержкой моделей. Это то, что я сделал, и это прекрасно работает. Еще лучше переопределить определения Cell, чтобы искать "." в значении имени и относиться к нему как к глубокой модели.
Имейте в виду, это работает только потому, что я использую backbone-реляционный метод, который возвращает экземпляры Model из вызовов get.