1

約 10 個の関数を反復処理する JavaScript の関数を作成しようとしています。

関数にjson URLを呼び出すサービスを作成する関数があります。これは以下のメイン関数と通信し、対応する URL へのオプションを指定してサービス関数を呼び出し、json 要求を開始するためのデータとして使用します。下記を参照してください;

var landp = {
getCountryCode : function(){
    console.info('landp.GetCountryCode');
    return window.location.pathname.match(/\/([a-zA-Z]{2})/)[1].toLowerCase();
},
Service : {
    getBaseUrl : function(){
        console.info('landp.Service.GetBaseUrl');
        return sprintf("/%s/service", landp.getCountryCode())
    },
    callService : function(method, options){
        console.info('landp.Service.CallService');
        var url = sprintf("%s/%s", landp.Service.getBaseUrl(), method);
        $.ajax({
            url : url,
            method : 'GET',
            success : options.success,
            error : options.error
        })
    },
    getCategories : function(options){
        landp.Service.callService('category', options);
    },
    getCategoryId : function(options){
        landp.Service.callService('category/id/13', options);
    },
            getCategoryTopTen : function(options){
        landp.Service.callService('category/name/top-ten', options);
    },
    getSeeMoreItems : function(options){
        landp.Service.callService('see-more', options);
    },
    getPartnerOffers : function(options){
        landp.Service.callService('partner-offers', options);
    }
}

}

getCategoryTopTen が、item.name、item.description などの適切なアイテムを取得するために使用する必要がある json データを保持する URL を呼び出すことがわかるので、これは正常に機能します。このコードは以下のとおりです。

landp.Service.getCategoryTopTen({
    success : function(data){
        $('#header').after('<div id="cat-sub-options"></div>');
        $('#cat-sub-options').after('<div class="flexslider"><ul class="slides"></ul></div><div id="carousel-button" class="click"></div>');            
        $.each(data[0].items, function(i, item){
        $('.flexslider .slides').append('<li class=""><h5>' + i + '</h5><a href="' + item.url + '"><img src="' + item.imageLargeUrl + '" alt="' + item.name + ' image" /><span>' + item.name + '</span></a></li>');
    });
    },
    error : function(){
        console.log("Error getting categories");
    }
})

ご覧のとおり、コードは上記で機能し、正しい情報を正しい要素などに取り込みます。現在、次のような約 10 のカテゴリがあります。

getCategoryTopTen getCategoryHistoryHeritage getCategoryWheretogo getCategoryショッピング getCategorySportyPeople

ご覧のとおり、それぞれが json ファイルのカテゴリ URL に割り当てられます。

私が修正しようとしているのは、たとえば次のすべてのカテゴリに対して上記を行う方法です: landp.Service.getCategoryTopTen すべてのカテゴリに itout を記述する代わりに、以下のコードを使用して、代わりに各関数に変数を渡すことはできますか?すべてのカテゴリでこれらの json 呼び出しをそれぞれ実行する必要があります。

どんな助けでも大歓迎です。

ありがとう、マーク

4

2 に答える 2

0

メソッド名の配列をループして、毎回同じコールバック関数で呼び出すことができます。関数を取得するには、ブラケット表記を使用します。

landp.Service[methodname](function(){…});

ただし、システムの各カテゴリに追加のメソッドを定義するのではなく、カテゴリ名を関数のパラメーターにすることを強くお勧めします。

…
getCategoryById: function(id, options){
    landp.Service.callService('category/id/'+id, options);
},
getCategoryByName: function(name, options){
    landp.Service.callService('category/name/'+name, options);
},
…

これで、配列のループがより便利になりました。

var cats = ["top-ten", "HistoryHeritage", "Wheretogo", "Shopping", "SportyPeople"];
for (var i=0; i<cats.length; i++) {
    var catname = cats[i];
    landp.Service.getCategoryByName(catname, {…});
}

ところで、要素を複数回作成するため、要素から ID を削除する必要がありますが、ID は一意である必要があります。

于 2012-09-19T18:53:51.137 に答える
0

問題が何であるかを完全に理解しているかどうかはわかりませんが、[] 表記を使用して JavaScript の子にアクセスすると、かなりのメリットが得られる場合があります。したがって、たとえば、呼び出すのではなく、呼び出す landp.Service.getCategoryTopTen()ことができlandp.Service["getCategoryTopTen"]()、これを引き出すことができるので、次のようになります。

var category="TopTen"
var method="getCategory"+category
land.Service[method](...)

そして、その周りにロジックをラップして、反復または自動化することができます。

于 2012-09-19T18:47:12.903 に答える