Backbone - выполнение множественной выборки() перед визуализацией представления - программирование
Подтвердить что ты не робот

Backbone - выполнение множественной выборки() перед визуализацией представления

Мне было интересно узнать о лучшем образце/подходе. Это функция в моем маршрутизаторе, поэтому пользователь нажимает "quotes/: id", но для этого представления для рендеринга мне нужен список их проектов, клиентов и валют. Какой был бы лучший способ убедиться, что все 3 выборки() произошли, прежде чем пытаться создать экземпляр представления quotesEdit? Является ли плохая практика захватить всю информацию, когда пользователь что-то нажимает?

    quotesEdit: function(id) {
        kf.Collections.quotes = kf.Collections.quotes || new kf.Collections.Quotes();
        kf.Collections.projects = kf.Collections.projects || new kf.Collections.Projects();
        kf.Collections.currencies = kf.Collections.currencies || new kf.Collections.Currencies();
        //do a fetch() for the 3 above
        kf.Collections.customers = kf.Collections.customers || new kf.Collections.Customers();
        var quote = kf.Collections.quotes.where({Id: parseInt(id, 10)});
        kf.Utils.ViewManager.swap('sectionPrimary', new kf.Views.section({
          section: 'quotesEdit',
          model: quote[0]
        }));
    }
4b9b3361

Ответ 1

Я нахожу комбинацию jQuery отложенных и подчеркивание invoke решает это элегантно:

//call fetch on the three collections, and keep their promises
var complete = _.invoke([quotes, projects, currencies], 'fetch');

//when all of them are complete...
$.when.apply($, complete).done(function() {
   //all ready and good to go...
});

Ответ 2

Promises! В частности jQuery.when

Вы можете сделать что-то вроде этого:

$.when(
  kf.Collections.quotes.fetch(),
  kf.Collections.projects.fetch(),
  kf.Collections.currencies.fetch()
).then(function(){
  // render your view.
});

jQuery.ajax(и по умолчанию с помощью базовой линии) возвращает обещание, и вы можете использовать $.when для установки функции обратного вызова после разрешения нескольких promises.

Ответ 3

Магистраль fetch возвращает объект jQuery Deferred (обещание). Таким образом, вы можете использовать jQuery когда функция ждет, пока все promises будут разрешены:


quotesEdit: function(id) {
  kf.Collections.quotes = kf.Collections.quotes || new kf.Collections.Quotes();
  kf.Collections.projects = kf.Collections.projects || new kf.Collections.Projects();
  kf.Collections.currencies = kf.Collections.currencies || new kf.Collections.Currencies();

  //do a fetch() for the 3 above
  var quotePromise = kf.Collections.quotes.fetch();
  var projectsPromise = kf.Collections.projects.fetch();
  var currenciesPromise = kf.collections.currencies.fetch();

  // wait for them to all return
  $.when(quotePromise, projectsPromise, currenciesPromise).then(function(){

    // do stuff here, now that all three have resolved / returned

    kf.Collections.customers = kf.Collections.customers || new kf.Collections.Customers();
    var quote = kf.Collections.quotes.where({Id: parseInt(id, 10)});
    kf.Utils.ViewManager.swap('sectionPrimary', new kf.Views.section({
      section: 'quotesEdit',
      model: quote[0]
    }));

  };

}

Я немного написал о promises и jQuery, когда здесь:

http://lostechies.com/derickbailey/2012/03/27/providing-synchronous-asynchronous-flexibility-with-jquery-when/

http://lostechies.com/derickbailey/2012/07/19/want-to-build-win8winjs-apps-you-need-to-understand-promises/

что вторая ссылка все еще действительна, несмотря на то, что основным объектом является Win8 JS