質問: 0; i < data.length; i++) { view.titles.push(data[i]); //Push titles into observable array } ``` なぜ "Mr"という値を持つ2つのオブジェクトがあるのか尋ねないでください。これは、対処しなければならないデータのやり方です。私はそれを変更することはできません。しかし、これが問題の原因です。私は最初のオブジェクトが選択されたオプションを表すと期待しますが、そうではありません。 3番目のオブジェクトは、実際にデフォルト選択として終わる `option` 要素を表します。 これは、観測可能な配列によって、ループが反復するときに `option` 要素が1つずつDOMに追加されるためです。ノックアウトは、選択したオプションをその値をチェックして保持しようとします。最初の反復の後、選択された `option` の値は "Mr"です。 3回目の繰り返しの後にKnockoutはそれが以前に選択されたオプションだと思って選択するように "Mr"という値を持つ別の `option` があります。 この問題を示すフィドルへのリンクがあります。 「デフォルト値」オプションは選択する必要がありますが、選択する必要はありません。ボタンをクリックして同じ値を持つ別のオプションを再度追加すると、そのオプションが選択されますが、ドキュメントによれば、そのオプションは選択されてはなりません。 私の質問は、どのようにこの行動を防ぐことができますですか?
回答: なぜアイテムを1つずつ配列にプッシュしていますか?あなたはちょうど行うことができます: ``` view.titles(data); ``` の代わりに ``` for(var i = 0; i < data.length; i++) { view.titles.push(data[i]); //Push titles into observable array } ``` This would also fix your problem - the first item would be selected by default. Also, if you are not planning on adding new items to that array, you could use ko.observable の代わりに ko.observableArray 更新: Knockoutjsは同じ値を持つ複数のオプションが好きではないようです。 selectタグに値バインディングを追加すると、コードが正しく機能しません(最初のアイテムではなく、3番目のアイテムが選択されます)。ただし、knockoutjsを使用すると、(値バインディングを使用して)選択したオブジェクトにアクセスできるので、optionsValueバインディングと値バインディングを使用してvalueバインディングを削除できます。jsfiddle.net/ej9Ue/1