私は 2 つの Bacon.jQuery を持っていますModels
(ただし、問題は Bacon で説明できますObservable
)。
foo
、bar
およびの3 つのコンボ ボックスがありquux
ます。bar
に依存し、foo
とquux
の組み合わせに依存しbar
ますquux
。とからコンボボックスfindQuux
の値を見つける関数があります。quux
foo
bar
ユーザーがfoo
コンボボックスを変更すると、bar
とquux
ボックスの値が選択されます。これは選択の実用的な実装ですquux
:
// WORKS
var quuxBus = new Bacon.Bus()
Bacon.onValues(fooModel, barModel, function (foo, bar)
{
quuxBus.push(findQuux(foo, bar))
})
quuxModel.addSource(quuxBus.toProperty('quux4'))
ページの読み込み時に正しく'quux4'
設定するにはハックが必要なため、このソリューションには少し問題があります。quux
しかし、次のより単純な解決策はまったく機能しません。
// DOESN'T WORK
var quuxCombo = Bacon.combineWith(findQuux, fooModel, barModel)
quuxModel.addSource(quuxCombo)
問題は、 aが見つからない不可能な組み合わせが与えられると、andとfindQuux
の有効な組み合わせが期待されてクラッシュすることです。foo
bar
quux
ユーザーがコンボボックスを変更したときに一度だけ呼び出されるため、onValues/push
ソリューションは機能します。が 2 回呼び出されるため、ソリューションは機能しません。findQuux
foo
bacon.combineWith
findQuux
のデータ ソースを実装するための推奨される方法は何quuxModel
ですか? 防御的なコーディングfindQuux
はオプションではありません。
完全なコードはhttp://jsfiddle.net/5zp4D/8/にあります。
更新:ページの読み込みに対して適切な値が既に存在foo
します。bar
フィドル リンクからわかるようfooModel
に、明示的な値で初期化され、barModel
その初期値から再計算されます。
var fooModel = Bacon.$.selectValue(fooDom, 'foo2-value')
var barModel = Bacon.$.selectValue(barDom)
barModel.addSource(fooModel.map(function (x)
{
return json[x][1].val
}))
foo
bar
決して無効な値を取らないでください。さらに、bar
ユーザーが変更されると再入力さfoo
れるため、有効な組み合わせのみが UI に表示されます。
アプローチの問題combineWith
は、ユーザーが切り替えるとfoo
、findQuux
関数が中間値で2回呼び出され、中間の組み合わせの1つが正しくなく、組み合わせの構成要素が個別に正しいことです。問題をよりよく説明するためにフィドルを変更しました:http://jsfiddle.net/5zp4D/12/
有効な組み合わせからわかるようにvar json
、1-1、1-2、2-3、2-4、および 2-5 です。
壊れたバージョンのコメントを外し、ログを追加しました。foo1
最初のコンボボックスを選択してから再度選択するとfoo2
、ログに 3 つではなく 4 つのメッセージが表示されます。
ページの読み込み時に、quux
値が正しく初期化されていることがわかります (2-4):
"valid combination of foo2-value and bar4-value"
foo1
代わりに選択すると、foo2
それfindQuuxDef
が 1-4 ( foo
is new, bar
is old) で呼び出され、次に 2-4 ( foo
is new, bar
is new)で呼び出されます。
"invalid combination of foo1-value and bar4-value"
"valid combination of foo1-value and bar2-value"
私の問題は、無効な中間の組み合わせがアプローチで発生しないことonValues/push
です。リンクされた要素を使用した UI への慣用的な推奨アプローチを知りたいです。