привет всем (это длинный пост, извините за это)как сделать дюрандаль (ветер) ждать? используя обещание
У меня есть 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 и другие вещи были добавлены.
Проблема заключается в том, что вы возвращаете обещание 'subscribe', а не' активировать'. Кроме того, настройка подписки внутри функции активизации приведет к тому, что несколько подписей будут настроены, если просмотр активирован несколько раз (это, скорее всего,). Вы должны их разделить. – Tyrsius
thanx. это была моя проблема, я просто переместил код в viewAtteched и все сработало, мне жаль, что я не смог отметить ваш ответ как «Ответ». ты замечательный. – Amirreza
Добавлено как ответ – Tyrsius