首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用数据绑定=with时,选项值为空

当使用数据绑定=with时,选项值为空
EN

Stack Overflow用户
提问于 2017-04-11 07:27:28
回答 2查看 1.7K关注 0票数 0

我正在使用knockoutJs进行select输入下拉操作,但是当使用数据绑定=时,选项值是空的。有人能帮我吗。

Dropdown.html

代码语言:javascript
复制
 <span class="price"><select data-bind="options: preferedTimeToPickup,optionsCaption: 'Dont Know or Does not Matter',
    optionsText: 'name',value: preferedTimeToPickupVal" id="u3413_input" ></select>
    </span>

Custom.js

代码语言:javascript
复制
    this.preferedTimeToPickup = 
    [{name:"Morning (8-11)",price:5},
     {name:"Lunch (11-2)",price:6},
     {name:"Afternoon (2-5)",price:7},
     {name:"Specific: 8:00",price:8.5},
     {name:"Specific: 9:00",price:9.5},
     {name:"Specific: 10:00",price:10.25},
     {name:"Specific: 11:00",price:11.25},
     {name:"Specific: 12:00",price:12.25},
     {name:"Specific: 1:00",price:13.25},
     {name:"Specific: 2:00",price:14.25},
     {name:"Specific: 3:00",price:15.25},
     {name:"Specific: 4:00 (closed at 4 on sat)",price:16.25}];

     this.preferedTimeToPickupVal = ko.observable();

使用下面的html显示数据

代码语言:javascript
复制
<p data-bind="with: preferedTimeToPickupVal">
 <span data-bind="text: name"></span> 
</p>
<p data-bind="with: preferedTimeToPickupVal">
<span data-bind="text: price"></span>
</p>

到目前为止,一切都很好,但是在select下拉列表中,value=""是空的,如果我在input type select中使用optionsValue: 'name',那么值就会呈现得很好,但是data-bind="with: preferedTimeToPickupVal不能在我想要显示数据的地方工作。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-11 07:36:12

您只需要添加optionsValue: price并使用pureComputed根据所选值获取正确的信息。

代码语言:javascript
复制
function viewModel () {
  var self = this;      
  self.preferedTimeToPickup = [
    {name:"Morning (8-11)",price:5},
    {name:"Lunch (11-2)",price:6},
    {name:"Afternoon (2-5)",price:7},
    {name:"Specific: 8:00",price:8.5},
    {name:"Specific: 9:00",price:9.5},
    {name:"Specific: 10:00",price:10.25},
    {name:"Specific: 11:00",price:11.25},
    {name:"Specific: 12:00",price:12.25},
    {name:"Specific: 1:00",price:13.25},
    {name:"Specific: 2:00",price:14.25},
    {name:"Specific: 3:00",price:15.25},
    {name:"Specific: 4:00 (closed at 4 on sat)",price:16.25}
  ];

  self.selectedPrice = ko.observable("");    

  // use this to get the selected value object and show it on the view
  self.preferedTimeToPickupVal = ko.pureComputed(function() {
    if(self.selectedPrice() !== "")
      return ko.utils.arrayFirst(self.preferedTimeToPickup, function(time) {
        return self.selectedPrice() === time.price;
      });
    return null;
  }, this);  
}

ko.applyBindings(new viewModel()); 
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<span class="price">
  <select data-bind="options: preferedTimeToPickup,optionsCaption: 'Dont Know or Does not Matter',
optionsText: 'name', optionsValue: 'price', value: selectedPrice" id="u3413_input" ></select>
</span>

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

票数 0
EN

Stack Overflow用户

发布于 2017-04-11 07:39:24

你的代码工作正常,请确保正确使用this

代码语言:javascript
复制
var vm = function () {
    this.preferedTimeToPickup = [{
        name: "Morning (8-11)",
        price: 5
      }
      //...
    ]

    this.preferedTimeToPickupVal = ko.observable()
}
ko.applyBindings(new vm());

编辑

好吧,我想我明白你想要什么。请看我更新的小提琴

基本上,如果您希望为您的value标记中的每个option节点拥有select属性,则必须在option绑定中使用optionsValue: 'name'选项。

通过这样做,您现在正在存储对象的name属性,而不是完整的对象。现在您必须找到一种方法来获取数组中与所选值匹配的正确对象。

要做到这一点,您可以安装一个临时变量来保存您的选择,以及一个可观察到的计算值,当选择发生变化时,可以对数组进行筛选,并获得正确的对象。

代码语言:javascript
复制
<span class="price"><select data-bind="options: preferedTimeToPickup,
    optionsCaption: 'Dont Know or Does not Matter',
    optionsValue: 'name',
    optionsText: 'name',
    value: _preferedTimeToPickupVal" id="u3413_input" ></select>
</span>

var vm = function () {
    this.preferedTimeToPickup = [ {}, {} ]
    this._preferedTimeToPickupVal = ko.observable();
    this.preferedTimeToPickupVal = ko.pureComputed(function() {
      var selectedVal = this._preferedTimeToPickupVal()
      var defaultVal = { price: null, name: null }
      var found = null
      if (selectedVal) {
        found = this.preferedTimeToPickup.filter(function(i) {
          return i.name === selectedVal
        })
      }
      return found && found[0] ? found[0] : defaultVal
    }, this)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43339365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档