【问题标题】:angularjs ng-repeat nested array into one unique listangularjs ng-repeat 嵌套数组到一个唯一列表中
【发布时间】:2017-02-15 10:57:05
【问题描述】:

我正在尝试将所有对象的嵌套数组中的所有值的列表放入一个列表中。
我的json文件结构如下:

{
    "booklist": {
        "fiction": [
          {
            "key": "book1",
            "value": "bookvalue1"
          },
          {
            "key": "book2",
            "value": "bookvalue2"
          }
        ],
        "romance": [
          {
            "key": "book3",
            "value": "bookvalue3"
          },
          {
            "key": "book4",
            "value": "bookvalue4"
          }
        ],
        "thriller": [
          {
            "key": "book5",
            "value": "bookvalue5"
          },
          {
            "key": "book6",
            "value": "bookvalue6"
          }
        ]         
}       

我正在尝试(我尝试过的)阅读下拉菜单中所有书籍的列表:

<ui-select name="books" ng-model="model.books" theme="selectize" required>
    <ui-select-match> {{$select.selected.value}} </ui-select-match>
    <ui-select-choices
            repeat="r.key as r in booklist | filter: $select.search">
        <div ng-bind-html="r.value | highlight: $select.search"></div>
    </ui-select-choices>
</ui-select>

这样下拉菜单将如下所示:

bookvalue1
bookvalue2
bookvalue3
bookvalue4
bookvalue5
bookvalue6

在另一个输入元素中,我想获取上面所选书籍的类别:

<input type="text" name="category" ng-model="model.category" class="form-control" disabled="disabled" value="??"/>

如何获取上面所选书籍类别的值?

最终目标是将类别价值和账面价值分别传递到我的模型中。

重要提示:

我不允许更改 json 结构,它应该保持原样。我只需要更改和调整代码以正确读取信息。

【问题讨论】:

  • 在控制器中映射一个扁平化数组
  • 或为此创建新过滤器

标签: javascript angularjs arrays json angularjs-ng-repeat


【解决方案1】:

你可以使用this code, 但我建议grouping books

【讨论】:

  • 为什么选择后类别模型为空?谢谢
  • 嗨@passion,你的意思是ctrl.selectedValue选择后是空的吗?
  • 我希望在第一个下拉菜单中选择以下内容,第二个输入字段是不必要的:{{ctrl.model.category}} 例如 fiction ,而{{ctrl.model.value}} 将是bookvalue1
  • 正如您在我的原始帖子中看到的那样,我的最终目标是将值和类别传递给另一个 ng-model,作为这个新 ng-model 的值。例如,ng-model="model.category" 将从上面的下拉选择中获取其默认值。
【解决方案2】:

您可以添加一些自定义过滤器,如下所示:

array1 = {
"booklist": {
    "fiction": [
      {
        "key": "book1",
        "value": "bookvalue1"
      },
      {
        "key": "book2",
        "value": "bookvalue2"
      }
    ],
    "romance": [
      {
        "key": "book3",
        "value": "bookvalue3"
      },
      {
        "key": "book4",
        "value": "bookvalue4"
      }
    ],
    "thriller": [
      {
        "key": "book5",
        "value": "bookvalue5"
      },
      {
        "key": "book6",
        "value": "bookvalue6"
      }
    ]         

}

.filter('filter', function(){
    return function(array1, searchTxt){
    angular.forEach(array1, function(v,k){
        if(v.value.indexOf(searchTxt) > -1){
          angular.forEach(v, function(v1, k1){
              return v1;
          })
      }
    })
  }
})

注意:我没有测试,请做需要的更改。

【讨论】:

  • 你能解释一下该怎么做吗?顺便说一句,我不允许更改 json 文件中的数组结构,它应该保持不变。
  • 对不起,我更新的 json 格式是错误的。现在已更正。
  • 您的输出 bookvalue1 bookvalue2 bookvalue3 bookvalue4 bookvalue5 bookvalue6 应该来自过滤器还是突出显示?
  • 那么 ng-repeat 应该是什么样子呢?请给个完整的示例答案好吗?
【解决方案3】:

如果您想在单个下拉列表中显示,请组合数组。像这样

 {
        "booklist": {
              {
                "key": "book1",
                "value": "bookvalue1"
              },
              {
                "key": "book2",
                "value": "bookvalue2"
              },
              {
                "key": "book3",
                "value": "bookvalue3"
              },
              {
                "key": "book4",
                "value": "bookvalue4"
              },
              {
                "key": "book5",
                "value": "bookvalue5"
              },
              {
                "key": "book6",
                "value": "bookvalue6"
              }

}   

或使用

<ui-select-choices
            repeat="r.key as r in booklist.fiction | filter: $select.search">
        <div ng-bind-html="r.value | highlight: $select.search"></div>
    </ui-select-choices>

【讨论】:

  • 我想要所有书籍的列表,而不仅仅是小说。
  • 这就是为什么我首先建议组合三个数组,因为你不能在一个 ui-select 中使用多个 ui-select-choices。
  • 是的,这就是为什么我也不允许将它们全部合并到一个数组中。它应该是这样的。
  • 你问的是不可能的。正如我上面提到的,你不能在单选中绑定多个数组。
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多