【发布时间】:2013-05-23 00:29:17
【问题描述】:
大家好(这篇文章很长,抱歉)
我有 3 个应根据彼此动态填充的下拉列表。
大陆 - 国家 - 联赛(足球)
我正在使用热毛巾(Durandal + 淘汰赛 + Breeze)
使用 john papa 提供的课程,我能够毫无问题地完成其中两个课程。 预装大陆和国家,它的工作就像一个魅力,但第三个没有。
我使用微风来获取数据,数据被检索,它不是关于数据,在一些 SSO(搜索 StackOverflow)之后,我的问题是“承诺” 我需要回报诺言,所以杜兰达尔可以理解它应该等待。 添加了更改,但仍然无法正常工作。
我发现的所有示例都在“激活”函数中工作(在激活函数中返回承诺),但我应该在 observable.subscribe 中返回承诺。
(以及所有提供这些出色产品的人,请提供更多带有更好标题的示例,为像我这样的新手提供常见场景的描述。谢谢大家)
我不知道我做错了什么。有什么建议吗?
查看:
<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>
查看 js 代码(只是重要部分)
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)
数据上下文
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,但在使用 Q.all 搜索 getLeaguesByCountryCode 后添加了其他内容。
【问题讨论】:
-
您的问题是您将承诺返回到
subscribe函数,而不是activate函数。此外,如果视图被多次激活(这很可能),在激活函数中设置订阅将导致设置多个订阅。你应该把它们分开。 -
谢谢。那是我的问题,我只是将代码移入 viewAtteched 并且一切正常,我希望我能够将您的答案标记为“答案”。你太棒了。
标签: knockout.js breeze durandal promise