javascript - 如何从每个绑定(bind)内部的 Oracle jet 下拉列表中唯一标识所选值

标签 javascript html knockout.js oracle-jet

1).我有三个名字 Bert,Charles,Denise.

  • 及其可观察索引(使用 current.observableIndex)。
  • 0:伯特,1:查尔斯,2:丹妮丝
  • 他们的当前状态显示在他们的名字前面(使用 current.data.status)

2).每个名字都有下拉和提交按钮。(使用oj-bind-for-each)

3).I can select value from the drop-down and submit(它将从下拉列表中捕获选定的值)

Action

  • 初始页面 View

    enter image description here

假设我选择了

  • 0: Bert 和下拉值作为 Firefox
  • 1:Charles 和下拉值作为 Safari
  • 2:Denise 和下拉值作为 Opera
  • 然后我点击来自 0: Bert
  • 提交按钮

问题

  • 提交按钮捕捉到我最后从 2: Denise 中选择的 Opera

期待

  • 我想为 0: Bert 提交按钮点击获取 Firefox

我怎样才能做到这一点?

代码

仪表板.html

      <div>    
      <oj-bind-for-each data="[[dataProvider]]">
          <template>
              <li>
              <oj-bind-text value="[[$current.data.status]]"></oj-bind-text>
              <oj-bind-text value="[[$current.observableIndex]]"></oj-bind-text> : <oj-bind-text value="[[$current.data.name]]"></oj-bind-text>
              <oj-button class='oj-button-sm' on-oj-action= "[[saveData]]">
                  Submit
              </oj-button>
              <oj-select-one id="[[uniquieId]]"
                             on-value-changed="[[selectedValue]]"  options="[[browsers]]" 
                             value="{{$current.data.status}}" style="max-width:20em">
              </oj-select-one>
              </li>

          </template>  
      </oj-bind-for-each>
  </div>

仪表板.js

define(['accUtils', 'knockout', 'ojs/ojarraydataprovider', 'ojs/ojknockout', 'ojs/ojbutton', 'ojs/ojselectcombobox'],
        function (accUtils, ko, ArrayDataProvider) {

            function DashboardViewModel() {
                var self = this;
                self.uniquieId = ko.observable();

                var users = ko.observableArray([
                    {id: "1", name: "Bert", status: "Internet Explorer"},
                    {id: "2", name: "Charles", status: "Chrome"},
                    {id: "3", name: "Denise", status: "Safari"}
                ]);
                self.dataProvider = new ArrayDataProvider(users, {keyAttributes: 'id'});
                self.selectVal = ko.observable('Chrome');
                self.selected = ko.observable();


                self.browsers = ko.observableArray([
                    {value: 'Internet Explorer', label: 'Internet Explorer'},
                    {value: 'Firefox', label: 'Firefox'},
                    {value: 'Chrome', label: 'Chrome'},
                    {value: 'Opera', label: 'Opera'},
                    {value: 'Safari', label: 'Safari'}
                ]);

                self.selectedValue = function (event, current) {

                    var optionValue = event.detail;
                    self.selected(optionValue.value);
                    console.log(self.selected());
                    console.log(optionValue);
                };

                self.saveData = function (event, current) {
                    self.uniquieId(current.observableIndex());
                    console.log(self.uniquieId());
                    console.log(self.selected());
                };

            }

            return DashboardViewModel;
        }
);

最佳答案

有 2 个修复要进行:

  1. oj-select-one 组件中,您将所选值绑定(bind)到 "{{$current.data.status}}"。但要使其正常工作,$current.data.status 必须能够更新其值,然后反射(reflect)最新值。当您将“状态”设为简单字符串时,这是不可能的。

相反,它们应该是可观察的:

var users = ko.observableArray([
     {id: "1", name: "Bert", status: ko.observable("Internet Explorer")},
     {id: "2", name: "Charles", status: ko.observable("Chrome")}),
     {id: "3", name: "Denise", status: ko.observable("Safari")}
]);

换句话说,必须通过用户交互更新的 View 和 Viewmodel 之间的任何值都应该是可观察的。

  1. 没有使用 selected observable,因为 selectedValue 函数只是将 selected 更新为最后选择的内容。相反,您可以使用其他变量 uniquieId 来获取正确的数据,因为您的 saveData 函数会使用您刚刚单击的行的索引更新 uniquieId提交。

因此,将您的 saveData 函数更改为:

            self.saveData = function (event, current) {
                self.uniquieId(current.observableIndex());
                console.log(self.uniquieId());
                console.log(users()[self.uniquieId()].status());
            };

关于javascript - 如何从每个绑定(bind)内部的 Oracle jet 下拉列表中唯一标识所选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59228973/

相关文章:

html - 如何在不使用边距或填充的情况下将带有按钮中心的 div 与左侧的 Logo 对齐

javascript - 如何在点击处理程序上检查键盘修饰符,如 "shift"?

javascript - 通过提供值列表(字符串)构造键值对数组

javascript - 用模态替换 javascript 警报

javascript - 如何处理未定义的函数参数

javascript - 水平翻转html网页而不是文本

html - 如何在 anchor 标记内定位两个元素

javascript - 是否有一种可靠的跨浏览器方式来使用 polyfills with knockout?

grails - 绑定(bind)不是来自 ViewModel 的值

php - 如何在论坛页面中监控用户