javascript - KnockoutJs ko.utils.arrayFirst 不允许重复值作为结果

标签 javascript knockout.js data-binding

我是 knockoutJs 的新手,因为我正在尝试通过绑定(bind)显示选定的值。但我面临着重复值的问题。

例如:

  • 根据下面的示例片段,如果我从下拉列表中选择一个,绑定(bind)结果将显示所选名称“one”,这是正确的。

{name:"one",price:32.50}, {name:"two",price:32.50},

  • 之后,如果我从下拉列表中选择其他选项,即名称二,绑定(bind)结果不会显示所选的名称二,而是继续仅显示名称=“一”,这是不正确的。
  • 观察结果:我发现出现这种情况是因为所有选项值设置了相同的价格,如果我使用不同的价格更新它们,选项值就会正确绑定(bind)。
  • 我的困惑是,为什么当价格值相同但名称不同时绑定(bind)逻辑无法正确应用。

我试图通过下面的代码来实现这一点。

HTML

<select data-bind="options: beforeEventPedersensDropoffCustomerLocation,optionsCaption: 'Please Choose Closest Location',
    optionsText: 'name', optionsValue: 'price', value: selectedPricebepdcl" id="before_event_pedersens_dropoff_customer_location_time" ></select>

JS

    self.beforeEventPedersensDropoffCustomerLocation = [
    {name:"one",price:32.50},
    {name:"two",price:32.50},
    {name:"three",price:32.50},
    {name:"four",price:32.50},
    {name:"five",price:32.50},
    {name:"six",price:32.50},
    {name:"seven",price:0}
  ];
   self.selectedPricebepdcl = ko.observable("");

   console.log()
    self.beforeEventVal = ko.computed(function() {
    if(self.selectedPricebepdcl() !== "")
      return ko.utils.arrayFirst(self.beforeEventPedersensDropoffCustomerLocation, function(time) {
        return self.selectedPricebepdcl() === time.price;
      });
    return null;
  }, this); 

结果

            <p data-bind="with: beforeEventVal">
                <span data-bind="text: name"></span>   
            </p>
            <p data-bind="with: beforeEventVal">
                <span data-bind="text: price"></span>
            </p>

谁能帮我解决这个问题。

最佳答案

问题在于您设置了 optionsValue: 'price',因此您所掌握的有关所选项目的唯一信息就是价格。然后,您尝试使用它从可用项目中查找所选项目,但您不能这样做,因为它不是唯一标识符。

相反,如果您不指定optionsValue,Knockout 将使用整个项目作为选择的值。这还可以让您无需查找选定的值,因为您已经拥有了选定的值。

function VM() {
  self = this;
  self.beforeEventPedersensDropoffCustomerLocation = [{
      name: "one",
      price: 32.50
    },
    {
      name: "two",
      price: 32.50
    },
    {
      name: "three",
      price: 32.50
    },
    {
      name: "four",
      price: 32.50
    },
    {
      name: "five",
      price: 32.50
    },
    {
      name: "six",
      price: 32.50
    },
    {
      name: "seven",
      price: 0
    }
  ];
  self.selectedBepdcl = ko.observable("");
  self.selectedName = ko.pureComputed(() => {
    const sb = self.selectedBepdcl();

    return sb && sb.name ? sb.name : '';
  });
}

ko.applyBindings(new VM());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<select data-bind="options: beforeEventPedersensDropoffCustomerLocation,
    optionsCaption: 'Please Choose Closest Location',
    optionsText: 'name',
    value: selectedBepdcl" id="before_event_pedersens_dropoff_customer_location_time">
</select>
<p data-bind="with: selectedBepdcl">
  <span data-bind="text: name"></span>
</p>
<p data-bind="with: selectedBepdcl">
  <span data-bind="text: price"></span>
</p>
Pretend this is hidden:
<input data-bind="value: selectedName">

关于javascript - KnockoutJs ko.utils.arrayFirst 不允许重复值作为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545113/

相关文章:

javascript - Knockout.js 不会将两个模板和 View 模型绑定(bind)到同一页面

javascript - 使用自定义绑定(bind)更新元素文本

c# - 如何正确绑定(bind)和更新 Xamarin.Forms ListView?

asp.net - Bind() 或 Eval() 是否会自动进行 HtmlEncode 以防止 XSS?

c# - 删除项目时 WPF TreeView itemselected 移动不正确

javascript - 以下函数中加号 (+) 的作用是什么,该函数摘自 jquery 源代码

javascript - 为什么 (0 || eval) 在 Opera 中不被视为间接?

javascript - 另一个函数内部的函数不起作用

javascript - 将数据绑定(bind)到 Knockout View 时出现闪烁问题

javascript - Node JS cookie 解析器不工作