1

大家好(这篇文章很长,抱歉)

我有 3 个下拉列表,它们应该基于彼此动态填充。

大陆 - 国家 - 联赛(足球)

我正在使用热毛巾(Durandal + 淘汰赛 + Breeze)

使用 john papa 提供的课程,我能够毫无问题地完成其中两个课程。预装大陆和国家,它的工作就像一个魅力,但第三个不是。

我正在使用微风来获取数据,检索数据,它与数据无关,在一些 SSO(搜索 StackOverflow)之后,我遇到的问题是“承诺”我需要返回承诺,所以 durandal 可以理解它应该等待。添加了更改,但仍然无法正常工作。

我发现的所有示例都在“激活”函数中工作(在激活函数中返回承诺),但我应该在 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之后添加了其他内容。

4

1 回答 1

2

您的问题是您将承诺返回订阅功能,而不是激活功能。此外,如果视图被多次激活(这很可能),在激活函数中设置订阅将导致设置多个订阅。你应该把它们分开。

于 2013-05-23T21:15:27.753 回答