0

私は iOS 9.2 SDK & Titannium SDK v5.1.2.GA で開発しています。

私のiPadアプリでは; 「割引」ボタンのある商品タブページがあります。クリックすると、TextField とピッカーを含むポップオーバーが次のように表示されます。

ここに画像の説明を入力

上記はオンザフライで作成されます。(コントローラー+ビューを使用していません)。

これは意図したとおりに機能します。私はこれをもう少し拡張して、製品に与えられた割引をalloy.jsというグローバル配列変数に記録Alloy.Globals.ProductDiscounts = [];することで (後で使用できるように) したいと考えました。

新しい割引価格を「キャプチャ」する方法は、ピッカーの「非表示」イベントをリッスンすることです。次に、グローバル配列を更新します。

デバッグ目的で、正しく記録されていることを確認するためにコンソール ログを追加しました。その後、Appcelerator Studio コンソール ウィンドウに、次のような無限の出力が表示されるようになりました。

ここに画像の説明を入力

ヌルのこの奇妙な一定の出力を停止するには、シミュレーターを強制終了する必要がありました。

これはこれまでの私のコードですが、コンソール ウィンドウが飛び散っている理由がわかりませんか? また、グローバル配列が設定されないのはなぜですか? または、設定されていますが、実際の console.log エントリを見逃しましたか?

// Subscribe to line discount button click event
lineDiscountButton.addEventListener('click', function(e)
{
    // Stop further events
    e.cancelBubble = true;

    // Create popover
    var discountPopover = Titanium.UI.iPad.createPopover({
        arrowDirection: Titanium.UI.iPad.POPOVER_ARROW_DIRECTION_RIGHT,
        orignalPrice: e.source.orignalPrice,
        priceButton: e.source.priceButton
    });
    var discountPopoverView = Titanium.UI.createView({
        width: 250,
        height: 210
    });

    // Create discount popover view wrapper
    var discountPopoverViewWrapper = Titanium.UI.createView({
        top: 10,
        left: 10,
        right: 10,
        bottom: 10,
        layout: 'vertical'
    });
    discountPopoverViewWrapper.add(Titanium.UI.createLabel({
        top: 0,
        left: 0,
        color: '#5C5C5C',
        font: {
            fontSize: 12
        },
        text: 'Enter a new Price'
    }));
    discountPopoverViewWrapper.add(Titanium.UI.createView({
        top: 0,
        height: 1,
        backgroundColor: '#0088CE',
        width: '100%'
    }));
    var discountPrice = Titanium.UI.createTextField({
        top: 0,
        width: '100%',
        height: Titanium.UI.SIZE,
        hintText: discountPopover.orignalPrice,
        value: discountPopover.orignalPrice,
        backgroundColor: '#FFFFFF',
        font: {
            fontSize: 18,
            fontWeight: 'bold'
        },
        color: '#5C5C5C'
    });
    discountPopoverViewWrapper.add(discountPrice);
    discountPopoverViewWrapper.add(Titanium.UI.createLabel({
        top: 10,
        left: 0,
        color: '#5C5C5C',
        font: {
            fontSize: 12
        },
        text: 'Or Select a Discount Percent'
    }));
    discountPopoverViewWrapper.add(Titanium.UI.createView({
        top: 0,
        height: 1,
        backgroundColor: '#0088CE',
        width: '100%'
    }));
    var discountPercentPicker = Titanium.UI.createPicker({
        top: 0,
        width: Titanium.UI.FILL,
        height: 112
    });
    var discountPercentValues = [];
    for (var i = 0; i <= 100; i++) {
        discountPercentValues.push(Titanium.UI.createPickerRow({
            title: i +'%'
        }));
    }
    discountPercentPicker.add(discountPercentValues);
    discountPercentPicker.addEventListener('change', function(e) {
        if (parseInt(e.rowIndex) === 0) {
            discountPrice.value = discountPopover.orignalPrice;
        } else {
            discountPrice.value = (discountPopover.orignalPrice - (discountPopover.orignalPrice * (parseInt(e.rowIndex) / 100))).toFixed(2);
        }
    });
    discountPopoverViewWrapper.add(discountPercentPicker);

    // Add discount popover view wrapper to view
    discountPopoverView.add(discountPopoverViewWrapper);

    // Set popover content view
    discountPopover.contentView = discountPopoverView;

    // Subscribe to popover hide event
    discountPopover.addEventListener('hide', function(e) {
        e.cancelBubble = true;
        Alloy.Globals.ProductDiscounts[discountPopover.priceButton.sku] = parseFloat(discountPrice.value).toFixed(2);
        Alloy.Globals.LiveBasketCollection.executeQuery("UPDATE live_basket SET Price = "+ discountPrice.value +" WHERE Sku = '"+ discountPopover.priceButton.sku +"'");
        discountPopover.priceButton.price = Alloy.Globals.DeviceDefaults.CurrencySymbol + discountPrice.value;
        discountPopover.priceButton.title = (discountPopover.priceButton.basketQuantity > 0 ? discountPopover.priceButton.basketQuantity +' x ' : '') + discountPopover.priceButton.price;
        Titanium.App.fireEvent('redrawBasket');
        discountPopover = discountPopoverView = discountPrice = discountPercentPicker = discountPercentValues = null;
        console.log(Alloy.Globals.ProductDiscounts);
    });

    //  Show popover
    discountPopover.show({
        view: lineDiscountButton,
        animated: true
    });     
});
4

1 に答える 1

0

質問として...なぜバブリングをキャンセルするのですか?

コードベースがなければ、提案を試みることしかできません。

1) イベントリスナーを追加します。

lineDiscountButton.addEventListener('click', setupData);

2) セットアップデータ

Function setupData(e) {

    lineDiscountButton.removeEventListener('click', setupData);

    Your code from the inline function.
}

基本的にイベントリスナーは一度起動したら削除するので、必要に応じて追加・削除してください。

卵を吸うように教えたくはありませんが、イベント リスナーを削除するには、追加した場合とまったく同じパラメーターを使用する必要があります。したがって、イベントリスナーのインライン関数は理想的ではありませんが、コードを独自の関数に分離することが望ましいです。

次の合金グローバル.... 良い習慣ではありません。将来の使用ではなく、アプリの実行中にのみデータを保持したいと考えています。

将来の使用のために必要な場合は、データをプロパティに保存できます。

お役に立てれば

T.

于 2016-02-04T21:29:51.883 に答える