2013-05-23 3 views
1

привет всем (это длинный пост, извините за это)как сделать дюрандаль (ветер) ждать? используя обещание

У меня есть 3 раскрывающихся списка, которые должны заполняться динамически на основе друг друга.

Континент - Страна - Лиги (футбол)

Я использую горячее Полотенце (Durandal + нокаут + Breeze)

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

Я использую ветерок для получения данных, данные извлекаются, это не данные, после некоторого SSO (поиск StackOverflow), я жестко проблема «обещаю» Мне нужно вернуть обещание, поэтому durandal может понять он должен ждать. добавил изменения, но все еще не работает.

все примеры, которые я нашел, работают в функции «активировать» (возвращать обещание в функции активации), но я должен возвращать обещание в наблюдаемой. Подписке.

(и все из вас, кто поставляет эти замечательные продукты, пожалуйста, предоставьте больше образцов с более названием, описанием для общих сценариев для новичков вроде меня. Спасибо ALLLL)

я не знаю, Что я делать неправильно. любое предложение?

вид:

<section title="Soccer Result"> 

    <select data-bind="options: continents, optionsText: 'name', value: selectedContinent, optionsCaption: 'Please Select a Continent'"></select> 
    <select data-bind="options: countries, optionsText: 'Title', value: selectedCountry"></select> 
    <select data-bind="options: leagues, optionsText: 'Title', value: selectedLeague"></select> 


    <ul id="popularLeagues" data-bind="foreach: popularLeagues"> 
     <li class="popularLeagueLI"> 
      <a> 
       <span data-bind="text: Title"></span> 
      </a> 
     </li> 
    </ul> 

View расслоение плотной код (только важные части)

function GetLeagueResultByCountryCode(countryCode) { 

      if (leagueResult()) { 
       datacontext.getLeagueResultPartials(leagueResult, countryCode, true); 
      } 
      logger.log("GetLeagueResultByCountryCode successd"); 
     } 

     var activate = function() { 

      selectedCountry.subscribe(function() { 
       if (selectedCountry()) { 
        { 
         if (!selectedCountry() || !selectedCountry().Code == undefined) 
          return; 

         //leagues.push({ ID: 340, Title: 'for test' }); 

         return datacontext.getLeaguesByCountryCode(leagues, selectedCountry().Code(), true) 

        } 
       } 
      }); 

      countriesAll(datacontext.lookups.countries); 
      boot(); 
     }; 

эта линия отвечает возвращать результат и раскрывающийся должны заполняться базу на это

return datacontext.getLeaguesByCountryCode(leagues, selectedCountry().Code(), true) 

DataContext

var getLeaguesByCountryCode = function (leagues, countryCode, forceRemote) { 

     var promiseTest = Q.all([ 
      getLeaguesByCountryCode2(leagues, countryCode, forceRemote) 
     ]) 

     return promiseTest.then(succeeded); 

     function succeeded() { 

      var x = 'y'; 
     } 
    } 
    var getLeaguesByCountryCode2 = function (leagues, countryCode, forceRemote) { 

     return EntityQuery.from('LeagueByCountryCode') 
      .withParameters({ countryCode: getKoValue(countryCode) }) 
      .select('ID,Title') 
      .using(manager). 
      execute(). 
      then(querySucceeded) 
      .fail(queryFailed); 


     function querySucceeded(data) { 
      var list = partialMapper.mapDtosToEntities(
       manager, data.results, 'League', 'ID'); 

      //list = data.results; 

      if (leagues) { 
       leagues(list); 
      } 
      logger.log('Retrieved [Leagues] from remote data source ' + getKoValue(countryCode), 
       data, true); 
     } 

    }; 

при первой попытке, я был просто вызов getLeaguesByCountryCode2, но после поиска getLeaguesByCountryCode с Q.all и другие вещи были добавлены.

+0

Проблема заключается в том, что вы возвращаете обещание 'subscribe', а не' активировать'. Кроме того, настройка подписки внутри функции активизации приведет к тому, что несколько подписей будут настроены, если просмотр активирован несколько раз (это, скорее всего,). Вы должны их разделить. – Tyrsius

+0

thanx. это была моя проблема, я просто переместил код в viewAtteched и все сработало, мне жаль, что я не смог отметить ваш ответ как «Ответ». ты замечательный. – Amirreza

+0

Добавлено как ответ – Tyrsius

ответ

2

Проблема заключается в том, что вы возвращаете обещание функции подписки, а не на функцию активации. Кроме того, настройка подписки внутри функции активизации приведет к тому, что несколько подписей будут настроены, если просмотр активирован несколько раз (это, скорее всего,). Вы должны их разделить.

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