【问题标题】:how to make durandal (breeze) wait? using promise如何让durandal(微风)等待?使用承诺
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 2017-06-24
    • 2018-05-27
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2018-03-13
    相关资源
    最近更新 更多