#javascript #json #backbone.js
#javascript #json #backbone.js
Вопрос:
У меня есть следующий JSON, который представляет данные моего сообщения в блоге (просто пример):
var post = {
id: 123,
title: 'Sterling Archer',
comments: [
{text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']},
{text: 'Comment test', tags: ['tag2', 'tag5']}
]
}
Каждая единица этого JSON имеет соответствующую модель магистрали или представление коллекции:
var PostModel = Backbone.Model.extend({
parse: function (response) {
if (response.comments) {
response.comments = new Backbone.Collection(response.comments, {
model: CommentModel
});
}
return response;
}
});
var CommentModel = Backbone.Model.extend({
parse: function (response) {
if (response.tags) {
response.tags = new Backbone.Collection(response.tags);
}
return response;
}
});
var post = new PostModel(post, {parse: true});
Мне нужно сохранить «путь» для каждой коллекции / модели, чтобы можно было получить для них что-то вроде следующего:
post.get('/comments/0'); // comment model: {text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']}
post.get('/comments/1/tags/1') // tag model with 'tag5'
Было бы здорово, если бы можно было получить абсолютный путь к модели и / или коллекции
Это лучший подход, чтобы сделать это допустимым?
Комментарии:
1. если не переопределять метод get, подумайте что-нибудь вроде этого post.get(‘comments’).get(123).get(‘tags’).get(456)
2. Хм. это очень интересный подход, но было бы полезно использовать его с любой структурой модели / контроллера, а не с предопределенной
Ответ №1:
Вы можете переопределить магистраль.Класс модели, добавьте пользовательский _get
метод, который поддерживает абсолютный путь. вот код переопределения
Backbone.Model = Backbone.Model.extend({
_get : function(path)
{
if(!path)
return;
var array = path.split('/');
var that = this;
var result = that;
_.each(array, function(o, i){
if(o amp;amp; result)
{
if(result instanceof Backbone.Collection)
result = result.at(o);
else if(result instanceof Backbone.Model)
result = result.get(o);
else if(_.isArray(result) || _.isObject(result))
result = result[o];
else
result = undefined;
}
});
return resu<
}
});
это будет поддерживать все структуры данных, такие как модель, коллекция, массив, объект
, с помощью которых вы можете его использовать
post._get('/comments/0');
post._get('/comments/1/tags/1');
Комментарии:
1. Спасибо за ответ, но вы уверены, что ваш код поддерживает получение модели / коллекции глубже, чем на один уровень?
2. спасибо, ваш код работает хорошо! Возможно ли получить абсолютный путь к модели / коллекции внутри них?