Data binding 如何在下拉列表中预选选项

Data binding 如何在下拉列表中预选选项,data-binding,select,initialization,knockout.js,Data Binding,Select,Initialization,Knockout.js,我已经查看了另一个问题,但无法使我的选择框正常工作: 我有以下游戏对象: function Game(visitingTeamDetails, homeTeamDetails, game) { if (arguments.length > 0) { this.VisitingTeamDetails = visitingTeamDetails; this.HomeTeamDetails = homeTeamDetails; this.GameId = ko.ob

我已经查看了另一个问题,但无法使我的选择框正常工作:

我有以下游戏对象:

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是具有
名称
SportTypeId
的对象

我有以下模板:

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

AvailableSportTypes
SportType
的列表

列表中包含下拉列表中的SportType名称,但我无法将初始选择设置为
SportType
。我编写了
sportTypeFunction
以显示数据输入正确,它将选择正确的值,但更改下拉列表中的选择不会更新SportType

我肯定我做错了什么。有人看到了吗


感谢当
游戏.SportType
传入时,它需要是对
游戏.AvailableSportTypes
中某个项目的引用,而不仅仅是一个看起来相同的对象

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

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

    alert(a === b); //false
因此,您需要调用函数来定位数组中的正确对象,并将其设置为可观察对象的值


并不是说它更好,而是在KO 1.3中,您可以扩展可观察项、可观察项和依赖项的
.fn
,以添加附加功能


下面是一个示例:

是否假定
SportType
为对象?如果是,在引用中传递的
game.SportType
是否为
game.AvailableSportTypes
数组中的项目?基本上,两个对象并不相等,除非它们实际上是对同一对象的引用<代码>变量a={name:“test”},b={name:“test”};警报(a==b)//错误非常好。这可以解释这种行为。所以我需要编写自己的比较运算符?或者我可以在某个地方重载原型函数吗?@RP Niemeyer-我实际上再次调用了sportTypeFunction来设置初始值,所有操作都正常,包括更改选项。不知道我以前做错了什么。感谢您指出对象平等性问题。有什么聪明的办法吗?我的函数感觉很粗糙。不是说它更好,而是在KO 1.3中,您可以扩展可观察、可观察的array和DependentoServable的
.fn
,以添加功能。这里有一个例子:真棒。谢谢如果你想把你的评论转移到一个答案上,我会把它标记为正确的。我的问题与OP相同。你的小提琴不起作用(它包括最新版本的KO)。当我把它改为包含v1.3-beta版时,它又能工作了。你知道如何使它与当前版本的KO一起工作吗?我用2.2.1更新了fiddle,它似乎正在工作:。你还看到问题吗?你能用小提琴重编吗?我不明白。。。在更新之前(使用类似ko latest debug.js的东西),它在FF和Chrome中不起作用。当我将外部资源更改为KO 1.3 beta版时,它成功了。在您的更新之后,它仍然有效。我目前无法重现该问题。我已链接到最新版本(2.2.1)的正确副本。项目中不再维护当前生成文件。我想我有一个问题的副本:。这可能和这个问题不完全一样。一些看似无关的代码使ko.applyBindings()失败。->请参阅小提琴中的注释部分。