0

私はデュランダル アプリを作成しています。現在作業中のビューには 2 つの<select>ボックスがあります。次のように、両方を a にバインドし、ko.observableArrayそれらの値を別の値にバインドしましたko.observable

<select data-bind="options: dateOptions, optionsText: 'display', value: selectedDate></select>
<select data-bind="options: buyerOptions, optionsText: 'display', value: slectedBuyer"></select>

2 番目の値は最初の値に依存するため、異なるタイミングで入力しています。activate()まず、呼び出し中にデータ ソースにクエリを実行し、別のメソッドにデータを渡して、リクエストによって返された promise が解決されたときに、データを (単純な JS オブジェクトの形式で) 配列に入力します。

var populateDateOptions = function(dates) {
    $.each(dates, function() {
        dateOptions.push({
            display: dateToString(this.pbDateOpt),
            date: this.pbDateOpt
        });
    });
};

それはうまくいきます -<select>ビューがレンダリングされたときに値が用意されています。しかし、その後、<select>それぞれの監視可能な配列の変更に応答することはできません。最初の で値が選択されると、次<select>はほぼ同じ方法で入力され、配列が実際に入力されている<select>ことを確認できますが、変化しません。また、開発ツールを介してオブジェクトをその配列にプッシュすることで最初に値を追加しようとしましたが、同じ結果が得られました。配列は更新されますが、UI は変更されません。buyerOptions<select><select>

他のいくつかのアプリで「オプション」バインディングを使用しましたが、これまでこの問題が発生したことはありませんでしたが、これは私の最初のデュランダル アプリなので、何か不足しているのではないかと考えています。

ありがとう!

更新 ビューにバインドされた要素をいくつか追加しましたが、どれも機能していないため、コンポーザーで何か奇妙なことが起こっているに違いありません。どこから問題を探し始めたらよいかわからない (ビューモデルとビューは、正常に動作している別のペアと構造が非常に似ています)。任意のヒント?

4

2 に答える 2

0

Just as a reference, this isn't a Durandal issue - this is a Knockout issue.

Also, a way that I have found most efficient to do this is the following the same way you have it -

<select data-bind="options: dateOptions, optionsText: 'display', value: selectedDate></select>
<select data-bind="options: buyerOptions, optionsText: 'display', value: selectedBuyer"></select>

but in your view model make the buyerOptions dependent directly on the dateOptions like so -

var buyerOptions = ko.computed(function () {
    var opts = ko.observableArray();
    if (!selectedDate()) { opts.push(display: '<Select a Date>'); }
    else { opts(getBuyersOptions(selectedDate().id()); }
    return opts;
});

This way if your selectedDate observable is empty (one hasn't been selected) then no buyerOptions appear, but if you select a date it will populate it based off some value in selectedDate, like Id. It will also automatically update whenever a new date is chosen, without you having to explicitly tell it to with JavaScript or w/e

于 2013-06-19T19:08:11.797 に答える
0

system.debug(true)main.jsで設定して Durandal のデバッグ モードをオンにすると、コンソールの警告では表示されなかったコード エラーを発見するのに役立ちました。それらが解決されると、すべてが正しくバインド/機能しました。

教訓 - 開発中はデバッグ モードをオンのままにしてください。

于 2013-06-20T13:18:17.800 に答える