2011-12-09 44 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列表。

该列表与下拉列表中的SportTypes名称一起提供,但我无法将初始选择设置为SportType。我写了sportTypeFunction向我表明自己数据传入正确,并且它会选择正确的值,但在下拉列表中更改我的选择不会更新SportType。

我确定我做错了什么。任何人都看到它?

感谢

+0

是'SportType'假设为对象?如果是这样,那么'game.SportType'是否被引用到'game.AvailableSportTypes'数组中的一个项目中?基本上两个对象是不相等的,除非它们实际上是对同一个对象的引用。 'var a = {name:“test”},b = {name:“test”};警报(a === b); //假' –

+0

优秀点。这将解释行为。所以我需要编写自己的比较运算符?或者我可以在某处重载原型函数? –

+0

@RP Niemeyer - 我实际上再次调用了sportTypeFunction来设置我的初始值,并且一切正常,包括更改选项。不知道我以前做错了什么。感谢您指出对象平等问题。有什么聪明的方法呢?我的功能感觉很不好。 –

回答

11

game.SportType被传递的,它需要在game.AvailableSportTypes到某个项目的参考,而不只是一个对象,它看起来是一样的。

基本上两个对象是不相等的,除非它们实际上是对同一个对象的引用。

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

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

所以,你需要调用你的函数在数组中找到正确的对象,并将其设置为可观察值的值。

并不是说它更好,但在KO 1.3中,您可以扩展observable,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