【发布时间】:2012-01-17 00:01:50
【问题描述】:
我查看了另一个问题,但无法让我的选择框正常工作: Binding initial/default value of dropdown (select) list
我有以下游戏对象:
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 是一个具有Name 和SportTypeId 的对象。
我有以下模板:
<td rowspan="3"><select data-bind="options: AvailableSportTypes, value: SportType, optionsText:'Name', optionsCaption: 'Choose...'" class="sportType"></select></td>
AvailableSportTypes 是SportType 的列表。
列表的下拉列表中包含 SportTypes 的名称,但我无法将初始选择设为 SportType。我写了sportTypeFunction 来向自己表明数据输入正确,它会选择正确的值,但在下拉列表中更改我的选择不会更新 SportType。
我确定我做错了什么。有人看吗?
谢谢
【问题讨论】:
-
SportType是否应该是对象?如果是这样,game.SportType是在对game.AvailableSportTypes数组中的项的引用中传递的吗?基本上两个对象是不相等的,除非它们实际上是对同一个对象的引用。var a = { name: "test" }, b = { name: "test" }; alert(a === b); //false -
好点。这可以解释这种行为。所以我需要编写自己的比较运算符?或者我可以在某处重载原型函数吗?
-
@RP Niemeyer - 我实际上再次调用了 sportTypeFunction 来设置我的初始值并且一切正常,包括更改选项。不知道我之前做错了什么。感谢您指出对象平等问题。有什么聪明的方法吗?我的功能感觉很hacky。
-
并不是说它更好,但在 KO 1.3 中,您可以扩展 observables、observableArrays 和dependentObservables 的
.fn以添加功能。这是一个示例:jsfiddle.net/rniemeyer/ZP79w -
太棒了。谢谢。如果您想将您的 cmets 移至答案,我会将其标记为正确。
标签: data-binding select initialization knockout.js