我希望你们一切顺利!
使用Backbone.js和node.js的应用程序的问题。 我正处于我想创建模型的情况,然后自动转到使用新创建的模型构建的其他uri:
MessageView = Backbone.View.extend({
events : {
'click #button' : 'go here'
}
go here : function(model) {
var message = new Message({model : model)};
var id = message.get('id');
// go to uri '/messages/id'
现在我已经使用Express设置了我的应用程序,因此我希望在此处向服务器发出一个真实的GET请求,从而调用新创建的模型中的数据。所以我想加载页面而不只是更改视图。 一种方法(我认为)就是
window.location = 'messages/'+id;
作为上面的最后一行,但我似乎有一种印象,这对于Backbone一般来说不是一个好习惯。 否则,可以在render方法中创建消息模型,然后在呈现视图时将其id直接写入按钮的href,但这看起来也很麻烦:
render : function() {
var message = new Message({model : model)};
var id = message.get('id');
$('a #button').attr('href', '/messages/'+id);
}
关于如何以更优雅的方式设置它的任何想法?提前谢谢!
答案 0 :(得分:1)
您确定要将浏览器页面实际更改为新的窗口位置吗?这样做会导致您的所有JavaScript和其他所有内容都重新加载。如果你需要调用GET到服务器来获取该模型id的信息,你只需要在具有id属性的模型上调用fetch。
从你在这里的小代码中,这可能更符合你要做的事情:
MessageView = Backbone.View.extend({
events : {
'click #button' : 'go_here'
},
go_here : function(model) {
//myID is the id of your message you want to get from the server
//I'll leave it up to you on how you get the id of what you
//want from that button
//I'll also assume that you have a router setup somewhere
//to handle navigation
MyApp.MyRouter.navigate("messages/"+id, {trigger: true});
}
});
然后,在您的路由器中,您将有一个路由设置来监视:
routes: {
"messages/:id" : "showMessage"
}
在showMessage
函数中:
showMessage: function(id) {
var message = new Message({id: id});
message.fetch({success: function(model) {
//render view of for the message to be shown
var messageView = new MessageView({model: model});
messageView.render();
});
}
以这种方式创建视图时,将使用已在其属性中包含消息的所有数据的模型创建视图。