淘汰赛下拉

时间:2013-02-13 21:35:06

标签: knockout.js

我无法获取绑定下拉列表中的所选项目。

<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/

6 个答案:

答案 0 :(得分:2)

对于您的原始问题@ Pete的回答是正确的,但由于您需要保留GroupId作为您可以this (modified fiddle)的值。

首先,selectedGroup属性已重命名为selectedGroupId

然后根据selectedGroup定义了新的计算可观察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已定义

答案 1 :(得分:2)

我只是想发布一个我最近用来解决这个问题的解决方案。它利用绑定处理程序(valueAppendText和textFromOption)并将一个observable附加到由下拉列表跟踪的observable。此解决方案不完整,但演示了不使用添加计算来获取下拉文本的想法。这个解决方案也使用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);
    }
  };

答案 2 :(得分: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>

答案 3 :(得分:0)

您还可以在可观察的selectedGroup上使用subscribe函数。我还创建了另一个observable作为&#34; selectedGroupId&#34;。

在订阅事件中,我将GroupId的值分配给新的observable&#34; selectedGroupId&#34;

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

请参阅更新的小提琴here

答案 4 :(得分:0)

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

jsfiddle

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

答案 5 :(得分:0)

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

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

我不喜欢在计算的可观察量中使用for循环。

Fiddle