Как получить вложенную модель магистрали и коллекции по этому пути, как в JSON?

#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. спасибо, ваш код работает хорошо! Возможно ли получить абсолютный путь к модели / коллекции внутри них?