1

我对 JS 和 OJET 很陌生。我正在使用 oracle jet 创建一个表单。我需要创建两个选择字段,第一个显示客户的姓名,下一个必须更改的是所选客户团队成员的值。

我有一个这种格式的 JSON 文件:

{
"clients": [
    {
        "id": "C01",
        "name": "Client 1",
        "manager": "Manager 1",
        "team": [
            {
               "id": "C1MEM1",
               "name": "member 1"
            },
            {
                "id": "C1MEM2",
                "name": "member 2"
            },
            {
                "id": "C1MEM3",
                "name": "member 3"
            },
            {
                "id": "C1MEM4",
                "name": "Member 4"
            }
        ]
    },
    {
        "id": "C02",
        "name": "Client 2",
        "manager": "Manager 2",
        "team": [
            {
               "id": "C2MEM1",
               "name": "member 1"
            },
            {
                "id": "C2MEM2",
                "name": "member 2"
            },
            {
                "id": "C2MEM3",
                "name": "member 3"
            },
            {
                "id": "C2MEM4",
                "name": "member 4"
            }
        ]
    }

我设法用客户名称创建了一个选择字段:

self.clientsListVal = ko.observableArray(['C01']);
  self.clientsList = ko.observableArray();
  $.getJSON("http://localhost:8000/js/json/clients.json").
    then(function(data){
      $.each(data["clients"],function(){
        self.clientsList.push({
          value: this.id,
          label: this.name
        });
      });
    });

然后我尝试以这种方式获取下一个选择字段,但它不起作用:(:

self.memberList = ko.observableArray();

$.getJSON("http://localhost:8000/js/json/clients.json").
then(function(data){
    $.each(data["clients"],function(){
        if (this.id === self.clientsListVal ) {
            $.each(this["team"], function(){
                self.memberList.push({
                    value: this.id,
                    label: this.name
                });
            });
        }
    });
});

这是使用的 HTML 即时消息:

    <div class="oj-applayout-content">
<div role="main" class="oj-hybrid-applayout-content">
  <div class="oj-hybrid-padding">
    <h3>Dashboard Content Area</h3>
    <div>
        <label for="clients">Clients</label>
        <select id="clients"
        data-bind="ojComponent:
        {component: 'ojSelect',
        options: clientsList,
        value: clientsListVal,
        rootAttributes: {style:'max-width:20em'}}">
        </select>


        <label for="select-value">Current selected value is</label>
        <span id="select-value" data-bind="text: clientsListVal"></span>

        <label for="members">Members</label>
        <select id="members"
        data-bind="ojComponent: {component: 'ojSelect',
        options: memberList,
        value: memberListVal,
        rootAttributes: {style:'max-width:20em'}}">
        </select>
    </div>
  </div>
</div>

任何帮助或提示?谢谢你!。

编辑:我认为问题在于self.clientsListVal返回一个函数而不是当前选择的值。我将 console.log(self.clientsListVal) 添加到视图模型以查看当前值。

如果我将self.clientsListVal更改为字符串:

if(this.id === 'C01'){}

我得到了客户“C01”的成员。

我尝试将 self.clientsListVal更改为$('#clients').val(),这是选择输入的 id,我在 console.log 中未定义。

如何在视图模型中获取选择字段字符串值?

4

1 回答 1

2

在 Knockout 中,可观察对象是函数——因此,当您直接请求可观察对象时,例如self.clientsListVal,您将获得函数定义。要获取基础值,请像函数一样调用 observable self.clientsListVal():。

所以你的测试变成了if (this.id === self.clientsListVal() ) {

现在你有另一个问题——可观察对象包含一个数组,而不是一个 ID。数组中可能只有一个 ID 元素,但您必须进入数组才能获取它。

由于您没有向我们展示值如何进入clientsListVal,因此很难说您需要做什么。它是否绑定到用户指定值的输入字段?它是从数据调用中填充的吗?无论哪种方式,您是否需要拥有多个 ID clientsListVal?如果您一次只需要持有一个 ID,请clientsListVal从 an更改observableArray为 simple observable,您的测试将正常运行。

如果clientsListVal可以保存多个值,则需要遍历它们。有多种方法可以做到这一点。您可以通过将 observableArray 的值分配给变量来获取基础数组:var clients = clientsListVal()clients现在保存数组,您可以使用 jQuery's $.each、 nativeArray.each或其他方式来循环或映射数组。或者您可以使用 Knockout 的内置数组实用程序,例如arrayForEach

如果您不想更改为常规的 observable 但希望数组只有一个元素,您可以像这样处理它clientsListVal()[0]——这是数组的第 0 个(第一个)元素。注意空数组。

于 2017-05-09T22:31:12.567 回答