перейти по ссылке без использования window.location - PullRequest
0 голосов
/ 12 марта 2012

Надеюсь, у вас все хорошо!

Вопрос к приложению, которое использует 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 в целом. В противном случае, можно просто создать модель сообщения внутри метода рендеринга, а затем записать его идентификатор непосредственно в href кнопки при рендеринге представления, но это также кажется грязным:

render : function() {
  var message = new Message({model : model)};
  var id = message.get('id');
  $('a #button').attr('href', '/messages/'+id);
}

Любые идеи о том, как я мог бы настроить это более элегантно? Заранее спасибо!

1 Ответ

1 голос
/ 12 марта 2012

Вы уверены, что хотите изменить страницу браузера на новое место в окне?Это приведет к перезагрузке всего вашего javascript и всего остального.если вам нужно вызвать GET на сервер, чтобы получить информацию для этого идентификатора модели, вам просто нужно вызвать fetch для модели с атрибутом id.

Из небольшого кода, который у вас есть, этоподробнее о том, что вы пытаетесь сделать:

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

Когда вы создаете представление таким образом, оно будет создано с моделью, в которой уже есть все данные для вашего сообщения в его атрибутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...