2011-12-09 13 views
4

私は、この他の質問を見てきましたが、正常に動作するように私の選択ボックスを取得することはできません:私は、次のゲームのオブジェクトを持っている Binding initial/default value of dropdown (select) listする方法でオプションを事前に選択し、ドロップダウンノックアウトJS

function Game(visitingTeamDetails, homeTeamDetails, game) { 
if (arguments.length > 0) { 
    this.VisitingTeamDetails = visitingTeamDetails; 

    this.HomeTeamDetails = homeTeamDetails; 

    this.GameId = ko.observable(game.GameId); 
    this.HomeTeamName = ko.observable(game.HomeTeamName); 
    this.VisitingTeamName = ko.observable(game.VisitingTeamName); 
    this.SportTypeName = ko.observable(game.SportTypeName); 
    this.HomeAccountName = ko.observable(game.HomeAccountName); 
    this.VisitingAccountName = ko.observable(game.VisitingAccountName); 
    this.GameDateString = ko.observable(game.GameDateString); 
    this.GameTimeString = ko.observable(game.GameTimeString); 
    this.AvailableSportTypes = ko.observableArray(game.Sports); 

    this.sportTypeFunction = function() { 
     for (sportType in this.AvailableSportTypes()) { 
      if (this.AvailableSportTypes()[sportType].Name == this.SportTypeName()) { 
       return this.AvailableSportTypes()[sportType]; 
      } 
     } 
     return null; 
    }; 

    this.SportType = ko.observable(game.SportType); 
} 
} 

SportTypeはNameSportTypeIdを持つオブジェクトです。

私は、次のテンプレートがあります。

<td rowspan="3"><select data-bind="options: AvailableSportTypes, value: SportType, optionsText:'Name', optionsCaption: 'Choose...'" class="sportType"></select></td> 

AvailableSportTypesSportTypeのリストです。

リストには、スポーツタイプの名前がドロップダウンリストに表示されますが、最初の選択をSportTypeにすることはできません。私はsportTypeFunctionと書いて、データが正しく入っていることを示し、正しい値を選択しますが、ドロップダウンで自分の選択を変更してもSportTypeは更新されません。

私は何か間違っていると確信しています。誰でもそれを見ますか? game.SportTypeが渡されます場合は

おかげで

+0

は 'オブジェクトであることを仮定SportType'ですか?その場合、 'game.AvailableSportTypes'配列の項目への参照で渡される' game.SportType'ですか?基本的に2つのオブジェクトは、実際には同じオブジェクトへの参照でない限り等しくありません。 'var a = {name:" test "}、b = {name:" test "};警告(a === b); // false' –

+0

優れた点。それはその行動を説明するでしょう。だから自分の比較演算子を書く必要がありますか?あるいは、プロトタイプ関数をどこかでオーバーロードできますか? –

+0

@RP Niemeyer - 私は実際に私の初期値を設定するために再びsportTypeFunctionと呼ばれ、オプションを変更することを含め、すべてが機能します。私が前に間違っていたことを知りません。オブジェクトの平等問題を指摘してくれてありがとう。その周りの任意の巧妙な方法?私の機能はハッキリと感じます。 –

答えて

11

、それは同じように見えるだけでオブジェクトgame.AvailableSportTypesないで項目を参照する必要があります。

基本的に2つのオブジェクトは、同じオブジェクトへの参照でない限り、等しくありません。

var a = { name: "test" }, 
    b = { name: "test" }; 

    alert(a === b); //false 

したがって、関数を呼び出して、配列内の正しいオブジェクトを探し、それをオブザーバブルの値として設定する必要があります。

KO 1.3では、observables、observableArrays、およびdependentObservablesの.fnを拡張して、機能を追加することができます。ここで

はサンプルです:http://jsfiddle.net/rniemeyer/ZP79w

+0

私はOPと同じ問題で戦っています。あなたのフィドルは動作しません(KOの最新バージョンが含まれています)。 v1.3-betaを含むように変更すると、再び動作します。あなたはKOの現在のバージョンでそれを動作させる方法を知っていますか? – M4N

+0

私は2.2.1でフィディルドを更新しました。それは動作しているようです:http://jsfiddle.net/rniemeyer/ZP79w/。あなたはまだ問題を抱えていますか?あなたはフィドルで再教育できますか? –

+0

私は理解できません...あなたの更新(ko-latest-debug.jsのようなものを使用して)の前に、それはFFとChromeでは動作しませんでした。私が外部リソースをKO 1.3ベータに変更したとき、それはうまくいった。あなたの更新の後、それはまだ動作します。私は現在問題を再現できません。 – M4N

関連する問題