0

Я делаю Rails-приложение, используя Backbone на интерфейсе. У меня есть две точки зрения: одна для модели публикации и одна для модели статьи. В представлении «Публикация» есть функция «createFeed», которая запускается, когда пользователь заполняет форму и нажимает кнопку. Когда это произойдет, я бы хотел, чтобы база данных обновлялась, а затем для двух представлений, чтобы получить повторную визуализацию. Пока не повезло.Backbone update Views

Вот функция маршрутизатора Backbone, что изначально делает обе точки зрения:

home: function(){ 
    var publications = new SimpleGoogleReader.Collections.Publications(); 
    publications.fetch({ 
     success: function(publications){ 
     var view = new SimpleGoogleReader.Views.PublicationsIndex({model: publications}); 
     view.render(); 
     } 

    }); 

    var articles = new SimpleGoogleReader.Collections.Articles(); 
    articles.fetch({ 
     success: function(articles){ 
     var view = new SimpleGoogleReader.Views.ArticlesIndex({model: articles}); 
     view.render(); 
     } 
    }); 
    }, 

Это функция createFeed в моей публикации Просмотр в Backbone. Почтовые запросы работают нормально, теперь просто пытаются выяснить, как обновить представления.

createFeed: function(e){ 
    e.preventDefault(); 
    var feed_url = $('#new_feed_name').val(); 

    $.post('/publications', {url: feed_url}, function(){ 
     $.post('/articles/force_update', {feed_url: feed_url}, function(){ 
      // should I put something here? 
     }); 
    }); 

    } 

Я попытался скопировать код у меня есть в моей домашней функции маршрутизатора в функцию обратного вызова для createFeed, который обновляется статьи только штраф, но вызвал проблемы при обновлении зрения публикации, я думаю, потому, что имея вид визуализации себя из одной из своих функций. Я также пытался включить это в представление, но не работал.

initialize: function() { 
    this.listenTo(this.model, "change", this.render); 
}, 

Как получить createFeed для обновления обоих представлений после отправки правильных данных в базу данных?

Любой ввод оценивается!

* UPDATE *

Rida BENHAMMANE и Джон Макмиллан спасибо за вход.

Я теперь обновить функцию «домашнего» маршрутизатора как таковой:

home: function(){ 
    var publications = new SimpleGoogleReader.Collections.Publications(); 
    var articles = new SimpleGoogleReader.Collections.Articles(); 
    var pubIndex = new SimpleGoogleReader.Views.PublicationsIndex({model: publications}); 
    var artIndex = new SimpleGoogleReader.Views.ArticlesIndex({model: articles}); 

    // create a method to replace the force_update post in your publications view 
    articles.listenTo(publications, "add", articles.force_update); 
    publications.fetch(); 
    articles.fetch(); 
    }, 

и функция createFeed с моей точки зрения публикации, как это:

createFeed: function(e){ 
    e.preventDefault(); 
    var feed_url = $('#new_feed_name').val(); 

    this.model.create({ 
     url: feed_url 
    }); 
    } 

Это по предложению Джона. Он отлично работает с точки зрения публикации и представления публикации. Конечно, теперь мне нужно написать код для публикации статей и обновить его в соответствии с комментарием Джона.

Это что-то, что я должен делать отдельно в представлении «Статьи»? Или я могу сделать это здесь, в моей функции createFeed в представлении «Публикация»? Если я сделаю это отдельно, у меня теперь будет два представления, имеющие функции для одного и того же события?

РЕШЕНИЕ! *

вид индекс публикации

initialize: function() { 
    this.listenTo(this.model, "sync", this.render); 
    }, 

    render: function(){ 
    this.$el.html(this.template({publications: this.model.toJSON()})); 
    return this; 
    }, 

    createFeed: function(e){ 
    e.preventDefault(); 
    var feed_url = $('#new_feed_name').val(); 
    var that = this; 

    this.model.create(
     {url: feed_url}, 
     { success: function(data){ 
      $.post('/articles/force_update', {url: feed_url, publication_id: data.id}, function(data){}); 
     } 
     } 
    ); 

    } 

Публикация Router

home: function(){ 

    var publications = new SimpleGoogleReader.Collections.Publications(); 
    var articles = new SimpleGoogleReader.Collections.Articles(); 
    var pubIndex = new SimpleGoogleReader.Views.PublicationsIndex({model: publications}); 
    var artIndex = new SimpleGoogleReader.Views.ArticlesIndex({model: articles}); 

    //method to replace the force_update post in your publications view 
    articles.listenTo(publications, "sync", function(){ 
     // var articles = new SimpleGoogleReader.Collections.Articles(); 
     articles.fetch({success: function(){}}); 
    }); 

    publications.fetch(); 

    }, 

я могу двигаться дальше со своей жизнью после того, как два дня. Лол. Спасибо за введение, ребята!!

ответ

0

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

См. Collection.create() и Collection.fetch(), для которых вы можете listenTo.

initialize: function() { 
    this.listenTo(this.model, "sync", this.render); 
}, 
createFeed: function(e){ 
    e.preventDefault(); 
    var feed_url = $('#new_feed_name').val(); 

    this.model.create({ 
     url: feed_url 
    }); 
} 

Вы можете слушать для add события в маршрутизаторе, чтобы вызвать второй пост. Представление для статей может прослушивать какое-то событие, вызванное сообщением force_update для визуализации, подобно функции инициализации выше.

home: function() { 
    var publications = new SimpleGoogleReader.Collections.Publications(); 
    var articles = new SimpleGoogleReader.Collections.Articles(); 
    var pubIndex = new SimpleGoogleReader.Views.PublicationsIndex({model: publications}); 
    var artIndex = new SimpleGoogleReader.Views.ArticlesIndex({model: articles}); 

    // create a method to replace the force_update post in your publications view 
    articles.listenTo(publications, "add", articles.force_update); 
    publications.fetch(); 
    articles.fetch(); 
} 

Слушая sync, вы можете удалить fetch({success:fn}) обратного вызова.

Update

Основная идея заключается в том, чтобы использовать систему событий Магистральной, чтобы поговорить между коллекциями и взглядами. Если к вам применяются стандартные варианты использования, используйте значения базовой линии по умолчанию, иначе используйте trigger("custom-event").

Внутри декларации SimpleGoogleReader.Collections.Articles

 // collection "add" event callbacks pass the model as the first n 
     // param to the callback 
     force_update: function(publication) { 
      var data = { 
       feed_url: publication.get("url") 
      }; 

      var callback = _.bind(function() { 
       this.trigger('force-update'); 
      }, this); 

      $.post('/articles/force_update', data).done(callback); 
     } 
    }); 

Внутри SimpleGoogleReader.Views.ArticlesIndex

 initialize: function() { 
      this.listenTo(this.model, "force-update", this.render); 
     } 
+0

Это сработало! Мне нужно потратить время, чтобы ознакомиться с методом рендеринга. – user2623706

+0

Вам нужно, чтобы новая публикация закончила создание (ответ от сервера) перед публикацией в статьях? – mcwilli

+0

Да, да. Я задал новый вопрос: http://stackoverflow.com/questions/21821134/backbone-shall-i-use-sync-or-jquery-can-i-listen-for-either/21824742?noredirect=1#21824742 – user2623706

0

Лучший способ сделать это:

1- Используйте sync функцию сбора позвоночника упорствовать свое состояние на сервер вместо использования $.post()

2- свяжи sync событие мнения рендеринг:

initialize: function() { 
    this.listenTo(this.model, "sync", this.render); 
} 

3- Держите ссылку на вашу коллекцию где-то, так что всякий раз, когда вы хотите обновить сервер с состоянием клиента, вызовите коллекции sync метод и если он ком Успешно ваши взгляды будут отменены.

+0

К сожалению это немного сбивает с толку, как использовать синхронизацию? Новое для магистрали. – user2623706

+0

Вы можете использовать его так: 'publications.sync ('update');' http://backbonejs.org/#Collection-sync –

Смежные вопросы