【问题标题】:How to pre-select an option in a dropdown knockout js如何在下拉淘汰赛js中预先选择一个选项
【发布时间】: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 是一个具有NameSportTypeId 的对象。

我有以下模板:

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

AvailableSportTypesSportType 的列表。

列表的下拉列表中包含 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


【解决方案1】:

game.SportType 被传入时,它需要是对game.AvailableSportTypes 中的一个项目的引用,而不仅仅是一个看起来相同的对象。

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

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

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

因此,您需要调用您的函数以在数组中定位正确的对象并将其设置为您的 observable 的值。

并不是说它更好,但在 KO 1.3 中,您可以扩展 observables、observableArrays 和dependentObservables 的.fn 以添加额外的功能。

这是一个示例:http://jsfiddle.net/rniemeyer/ZP79w

【讨论】:

  • 我正在与 OP 遇到同样的问题。你的小提琴不起作用(它包括最新版本的 KO)。当我将其更改为包含 v1.3-beta 时,它又可以工作了。你知道如何让它与当前版本的 KO 一起工作吗?
  • 我用 2.2.1 更新了小提琴,它似乎正在工作:jsfiddle.net/rniemeyer/ZP79w。你还看到问题吗?你能在小提琴中重现吗?
  • 我不明白...在您更新之前(使用 ko-latest-debug.js 之类的东西),它在 FF 和 Chrome 中不起作用。当我将外部资源更改为 KO 1.3 beta 时,它起作用了。更新后它仍然有效。我目前无法重现该问题。
  • 我链接到最新版本 (2.2.1) 的正确副本。当前的构建文件不再在项目中维护。
  • 我想我对我的问题有一个重现:jsfiddle.net/eNvGS。这可能与这个问题不完全相同。一些看似无关的代码使 ko.applyBindings() 失败。 -> 查看小提琴中的注释部分。
猜你喜欢
  • 2014-06-26
  • 2013-02-14
  • 2023-03-08
  • 2015-11-05
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多