В чем разница между url и urlRoot

Я хотел бы знать, в чем разница между использованием url или urlRoot. Я прочитал документацию (backbonejs.org/#Model-url), но я все еще чувствую, что мне не хватает знаний в этой области и я хотел бы знать больше. Когда вы должны использовать url? И в другом случае, когда вам нужно использовать urlRoot?

1 ответов


.urlRoot доступно только в модели, и полезен только тогда, когда модели не является частью коллекции, или когда вы хотите переопределить .url свойство коллекции, частью которой является эта модель.

другими словами, модель не требует ни .url, ни .urlRoot свойство, когда оно является частью коллекции с .url набор свойств, в этом случае эта модель будет использовать эту коллекцию .url как это свой .urlRoot.

здесь несколько примеры, которые показывают разницу. При запуске скриптов http-запросы можно увидеть в сетевой панели браузера.

Пример 1. Post не является частью коллекции. urlRoot определяет базовую часть URL-адреса. Когда модель извлекается, ее id добавляется к urlRoot.

var Post = Backbone.Model.extend({
  urlRoot: 'http://jsonplaceholder.typicode.com/posts'
});

var secondPost = new Post({ id: 2 });
secondPost.fetch();
/*requests http://jsonplaceholder.typicode.com/posts/2 */
<script src='http://code.jquery.com/jquery.js'></script>
<script src='http://underscorejs.org/underscore.js'></script>
<script src='http://backbonejs.org/backbone.js'></script>

Пример 2. вызов fetch на модели, которая является частью коллекции, использует url as the urlRoot

var Post = Backbone.Model.extend();
var Posts = Backbone.Collection.extend({
  url: 'http://jsonplaceholder.typicode.com/posts',
  model: Post
});

var posts = new Posts();
posts.add({id: 2});
posts.first().fetch();
/*requests http://jsonplaceholder.typicode.com/posts/2 */
<script src='http://code.jquery.com/jquery.js'></script>
<script src='http://underscorejs.org/underscore.js'></script>
<script src='http://backbonejs.org/backbone.js'></script>

Пример 3. url set на модели будет буквально использовать этот url для любого экземпляра модели.

var Post = Backbone.Model.extend({
  url: 'http://jsonplaceholder.typicode.com/posts'
});
var secondPost = new Post({ id: 2 });
secondPost.fetch();
/*requests http://jsonplaceholder.typicode.com/posts */
<script src='http://code.jquery.com/jquery.js'></script>
<script src='http://underscorejs.org/underscore.js'></script>
<script src='http://backbonejs.org/backbone.js'></script>

Пример 4. url может быть функцией, и она снова начинает иметь смысл.

var Post = Backbone.Model.extend({
  url: function(){
    return 'http://jsonplaceholder.typicode.com/posts/' + this.get('slug');
  }
});
var secondPost = new Post({ slug: 2 });
secondPost.fetch();
/*requests http://jsonplaceholder.typicode.com/posts/2 */
<script src='http://code.jquery.com/jquery.js'></script>
<script src='http://underscorejs.org/underscore.js'></script>
<script src='http://backbonejs.org/backbone.js'></script>