3

我在获取绑定下拉列表的选定项目时遇到问题。

<p>
  Your Group: 
  <select data-bind="options: availableGroups, optionsText: 'Name', optionsValue: 'GroupId', value: selectedGroup, optionsCaption: 'Choose...'"></select>
</p>
<p>
  I am visible
  You have chosen <span data-bind="text: selectedGroup() ? selectedGroup().Name : 'Nothing'"></span>
</p>

当我从下拉列表中选择某些内容时,我想获取选择的文本,而不是值。我对淘汰赛很陌生,并试图解决这个问题。我为此创建了一个小提琴。

http://jsfiddle.net/voam/FjRxn/

4

6 回答 6

2

我只是想发布一个我最近一直在使用的解决方案来解决这个问题。它利用绑定处理程序(valueAppendText 和 textFromOption)并将一个可观察对象附加到由下拉列表跟踪的可观察对象。此解决方案并不完整,但演示了不使用添加计算来获取下拉文本的想法。这个解决方案还使用了 jQuery,它可以被删除,但是由于我在我的项目中(大部分)使用 jQuery,所以我把它留在里面。下面的 jsFiddle 链接演示了这个功能。

小提琴:http: //jsfiddle.net/FjRxn/65/

标记:

<select data-bind="options: availableGroups, optionsText: 'Name', optionsValue: 'GroupId', valueAppendText: selectedGroup, optionsCaption: 'Choose...'"></select>

<p>
    I am visible
    You have chosen <span data-bind="textFromOption: selectedGroup"></span>
    <div>
        Group Id: <span data-bind="text: selectedGroup"></span>
    </div>
</p>

绑定处理程序:

ko.bindingHandlers.valueAppendText = {
    init: function(element, valueAccessor, allBindingsAccessor, context) {
      var $element, newValueAccessor, observable, setText;

      observable = valueAccessor();
      observable.selectedOptionText = ko.observable(null);
      newValueAccessor = function() {
        return observable;
      };
      $element = $(element);
      setText = function() {
        return observable.selectedOptionText($element.find("option:selected").text());
      };
      setTimeout(setText, 5);
      $element.change(function() {
        return setText();
      });
      return ko.bindingHandlers.value.init(element, newValueAccessor, allBindingsAccessor, context);
    },
    update: function(element, valueAccessor, allBindingsAccessor, context) {
      return ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, context);
    }
  };

  ko.bindingHandlers.textFromOption = {
    update: function(element, valueAccessor, allBindingsAccessor, context) {
      var newValueAccessor, observable;

      observable = valueAccessor();
      newValueAccessor = function() {
        if (ko.isObservable(observable.selectedOptionText)) {
          return observable.selectedOptionText();
        }
        return observable();
      };
      return ko.bindingHandlers.text.update(element, newValueAccessor, allBindingsAccessor, context);
    }
  };
于 2013-12-12T04:14:28.390 回答
2

对于您最初的问题@Pete 的回答是正确的,但是由于您需要保留 GroupId 作为您可以执行此操作的值(修改过的小提琴)

首先,该selectedGroup属性被重命名为selectedGroupId

selectedGroup然后基于以下定义了一个新的计算 observable selectedGroupId

self.selectedGroup = ko.computed(function () {
  for (var i = 0; i < groups.length; i++) {
    if (groups[i].GroupId == self.selectedGroupId())
      return groups[i];
  }
  return null;
});

var self = this定义了

于 2013-02-14T01:50:48.953 回答
0

您还可以在可观察的 selectedGroup 上使用订阅功能。我还创建了另一个 observable 作为“selectedGroupId”。

在订阅事件中,我将 GroupId 的值分配给新的 observable “selectedGroupId”

 self.selectedGroup.subscribe(function(item)
     {
          debugger;
          self.selectedGroupId(item.GroupId);
          return item.Name;
      });

在此处查看更新的小提琴

于 2013-02-14T08:23:49.467 回答
0

改变

<select data-bind="options: availableGroups, optionsText: 'Name', optionsValue: 'GroupId', value: selectedGroup, optionsCaption: 'Choose...'"></select>

至:

<select data-bind="options: availableGroups, optionsText: 'Name', value: selectedGroup, optionsCaption: 'Choose...'"></select>
于 2013-02-13T21:41:30.083 回答
0

最简单的解决方案是从元素中删除 optionsValue 绑定。然后它将整个对象存储在可观察对象中,您可以访问所有属性。

jsfiddle

<select data-bind="options: availableGroups, optionsText: 'Name',
value: selectedGroup, optionsCaption: 'Choose...'"></select>
于 2016-08-30T15:08:25.547 回答
0

就我个人而言,我会使用@pomber 的答案,并进行少量编辑。

self.selectedGroup = ko.computed(function(){
  return ko.utils.arrayFirst(self.availableGroups(), function(grp) {
    return grp.GroupId == self.selectedGroupId();
  }
}, this);

我不喜欢在计算的 observables 中使用 for 循环。

小提琴

于 2016-12-08T10:10:06.857 回答