gpt4 book ai didi

javascript - 在 Backbone 中动态更改 url

转载 作者:数据小太阳 更新时间:2023-10-29 06:07:35 25 4
gpt4 key购买 nike

我试图动态更改路由器内的 url,但无法做到,它一直返回到基本 Collection URL。在这里,我发布了包含 3 个不同集合的代码,除了指向三个不同的 url 之外,它们的作用完全相同。我只有一个 model 和三个依赖于该模型的 collection,它们甚至呈现相同的 View 。我如何动态更改 url 以便我只能创建一个 Collection 和一个 Model?对于这样的案例,这是最佳做法吗?

    // MODELS & COLLECTIONS 
window.Post = Backbone.Model.extend({
urlRoot: function() {
return 'http://localhost:5000/json/guides/:id'
}
})

App.Collections.RecentPosts = Backbone.Collection.extend({
model: Post,
url:'http://localhost:5000/json/posts/recent',
})
App.Collections.PopularPosts = Backbone.Collection.extend({
model: Post,
url:'http://localhost:5000/json/posts/popular',
})
App.Collections.FeaturedPosts = Backbone.Collection.extend({
model: Post,
url:'http://localhost:5000/json/posts/featured',
})

// CONTROLLER
App.Controllers.Documents = Backbone.Router.extend({
routes:{
"recent" : "recent",
"popular" : "popular",
"featured" : "featured",
},

recent: function(){
//.... same as featured ?
},
popular: function(){
//.... same as featured ?
},
featured: function(){
$("#browser").empty();
var collection = new App.Collections.Posts();
collection.fetch({
success: function(col,posts){
new App.Views.GuideView({collection: posts});
},
error: function(error){
console.log(error)
}
})
}
});

最佳答案

有许多不同的方法可以做到这一点。这可能是“最佳实践”。

App.Controllers.Documents = Backbone.Router.extend({
routes:{
"recent" : "recent",
"popular" : "popular",
"featured" : "featured",
},

initialize: function () {
this.collection = new App.Collections.Posts();
},

_showPage: function (config) {
$("#browser").empty();

this.collection.fetch({
url: config.url,
success: function(col,posts){
new App.Views.GuideView({collection: posts});
},
error: function(error){
console.log(error)
}
});
},

recent: function(){
this._showPage({url:'http://localhost:5000/json/posts/recent'});
},
popular: function(){
this._showPage({url:'http://localhost:5000/json/posts/popular'});
},
featured: function(){
this._showPage({url:'http://localhost:5000/json/posts/featured'});
}
});

由于我真的不知道您的页面会变得多复杂,这可能是我在没有更多信息的情况下所能做的最好的事情。但是,这个想法是在路由器初始化时设置“this.collection”..所以你可以继续重复使用它。 _showPage 方法执行显示页面所需的任何基本任务,路由调用的方法使用它来执行在进入细节之前需要完成的任何基本任务。传递到配置中的 url 将简单地告诉集合从何处获取其信息 - 我假设您的所有数据都具有相同的格式并且“是同一件事”.. 只是不同的过滤器。

您可以使用 App.Views.GuideView 做类似的事情:

App.Controllers.Documents = Backbone.Router.extend({
routes:{
"recent" : "recent",
"popular" : "popular",
"featured" : "featured",
},

initialize: function () {
this.collection = new App.Collections.Posts();
this.view = new App.Views.GuideView({collection: this.collection});
},

_showPage: function (config) {
$("#browser").empty();

this.collection.fetch({
url: config.url,
success: _.bind(function(col,posts){
this.view.render();
}, this),
error: function(error){
console.log(error)
}
});
},

recent: function(){
this._showPage({url:'http://localhost:5000/json/posts/recent'});
},
popular: function(){
this._showPage({url:'http://localhost:5000/json/posts/popular'});
},
featured: function(){
this._showPage({url:'http://localhost:5000/json/posts/featured'});
}
});

“渲染”只会重建 View ,因为您已经在 View 中将集合引用为“this.options.collection”(或者您可以向 View 添加“初始化”并设置它。集合为 this.options.collection)。当集合更新时,所有这些信息都在 View 中通过引用..所以不需要重置它。

关于javascript - 在 Backbone 中动态更改 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com