1

こんにちは(長文です、すみません)

互いに基づいて動的に入力する必要がある3つのドロップダウンリストがあります。

大陸 - 国 - リーグ (サッカー)

ホットタオル(デュランダル+ノックアウト+ブリーズ)を使っています。

ジョンパパが提供したコースを使用して、そのうちの2つを問題なく埋めることができました. 大陸と国がプリロードされていて、魅力的に機能していますが、3 つ目はそうではありません。

データのフェッチにそよ風を使用しています。データは取得されます。データに関するものではありません。SSO(StackOverflowの検索)の後、問題は「約束」です。約束を返す必要があるため、デュランダルは待つ必要があることを理解できます。変更を追加しましたが、まだ機能していません。

私が見つけたすべての例は「アクティブ化」関数で機能しています(アクティブ化関数で約束を返します)が、observable.subscribeで約束を返す必要があります。

(そして、これらの優れた製品を提供しているすべての人は、より良いタイトルと、私のような初心者向けの一般的なシナリオの説明を含むサンプルを提供してください。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>

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 に答える