在不使用window.location的情况下关注链接

时间:2012-03-12 06:49:56

标签: node.js backbone.js express

我希望你们一切顺利!

使用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);
}

关于如何以更优雅的方式设置它的任何想法?提前谢谢!

1 个答案:

答案 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();
    });
}

以这种方式创建视图时,将使用已在其属性中包含消息的所有数据的模型创建视图。