3

次の(簡略化された)オブジェクトリテラルがあります。アイコンメソッドは、クロージャを使用してアイコン変数を非表示にします。これは、後で検索するための連想配列として使用したいと思います。

var MapListings = {
    icons: function () {
        var allIcons = [] ;

        return {
            add: function (iconType, iconImage) {
                var icon = new GIcon(MapListings.baseIcon);
                icon.image = iconImage;
                allIcons[iconType] = icon; // fails, but this is what I want
                // allIcons.push(icon); // works, but this is not what I want
            },
            get: function () {
                return allIcons;
            }
        };

    } ()
}

次のように、アイコンオブジェクトにアイテムを追加します。

MapListings.icons.add("c7", "/images/maps/blue.png");
MapListings.icons.add("c8", "/images/maps/red.png");

以下は機能しません。

allIcons[iconType] = icon;

しかし、これはします:

allIcons.push(icon);

クロージャーの外では、連想配列スタイルは正常に機能するので、おそらくjQueryとの競合がありますか?ファイアバグaで発生するエラーは、未定義であり、ライブラリから発生しているように見えます。連想配列のスタイルを維持したい。

何か案は?

アップデート

この競合はグーグルマップから来ているようです。奇妙なことに、これを回避する方法がわかりません。

ダンバスアップデート

ベースGIcon()オブジェクトを返したオブジェクトリテラルの部分は、オブジェクトをまったく返していませんでした。そのため、オブジェクトには適切なプロパティがありませんでした。

baseIcon: function () {
    var base = new GIcon();
    base.shadow = '/images/maps/shadow.png';
    base.iconSize = new GSize(12, 20);
    base.shadowSize = new GSize(22, 20);
    base.iconAnchor = new GPoint(6, 20);
    base.infoWindowAnchor = new GPoint(5, 1);
    return base;
}

また、MapListings.baseIconはMapListings.baseIcon()と同じではありません。ドー

4

3 に答える 3

4

ルックアップテーブルが必要な場合は、var allIcons = {}

編集:技術的にはどちらの方法でも機能するはずですが、配列はオブジェクトです。これ以上ないのですか?

編集#2:MapListingsのプロパティとしてallIconsを作成することはできませんか?

編集#3:動作していると思いますが、正しくアクセスしていない可能性がありますか?それか、Googleでオブジェクトを作成できなかったか、投稿したエラーが他の場所で発生していて、ここでは発生していません

function GIcon(){};
var MapListings = {
    icons: function () {
        var allIcons = [] ;

        return {
            add: function (iconType, iconImage) {
                var icon = new GIcon(MapListings.baseIcon);
                icon.image = iconImage;
                allIcons[iconType] = icon; // fails, but this is what I want
                // allIcons.push(icon); // works, but this is not what I want
                window.x = allIcons
            },
            get: function () {
                return allIcons;
            }
        };

    } ()
};

MapListings.icons.add("c7", "/images/maps/blue.png");
MapListings.icons.add("c8", "/images/maps/red.png");

alert( MapListings.icons.get()['c8']['image'] )

.lengthを使用してループするのではなく、c7またはに直接アクセスする必要がありますc8

x = MapListings.icons.get();
for ( var prop in x ) {
    if ( x.hasOwnProperty(prop ) ) {
        alert( x[prop]['image'] )
    }
}
于 2010-07-13T18:54:11.633 に答える
1

したがって、これを修正するためにできることの1つは、配列を参照する方法を変更することです。addメソッドの外部にあるため、これを行います。

MapListings.icons["c7"]

これを使用して、add関数内の配列に追加することもできます。

add: function (iconType, iconImage) { 
    MapListings.icons[iconType] = iconImage;
}, 
于 2010-07-13T19:12:38.703 に答える
0

allIcons[iconType] = icon;allIconsはオブジェクトではなく配列であるため、失敗します。代わりに初期化allIconsしてみてください。{}これにより、アイテムをキーごとにコレクションに配置できます。

于 2010-07-13T18:57:38.817 に答える