【问题标题】:AngularJS select list with optgroups with selected item with combined labelAngularJS 选择列表与 optgroups 与组合标签的选定项目
【发布时间】:2015-08-05 07:04:16
【问题描述】:

我需要制作具有良好价值和标签的分组列表。 标签应由标签+值组合。 还应选择一项。

我的代码

<div ng-controller="MyCtrl">
    <select ng-model="selectedVal" ng-options="v.label as v.number group by v.group for v in list">
    </select>
</div>

var myApp = angular.module('myApp', []);

function MyCtrl($scope) {

    $scope.selectedVal = 234;
    $scope.list = [
        {
        number: 123,
        label: "A",
        group: 'aa'},
    {
        number: 234,
        label: "B",
        group: 'aa'},
    {
        number: 345,
        label: "C",
        group: 'bb'},
        ];
}

http://jsfiddle.net/mn2nk6rb/2/

在我的代码中: 1:值不正确,它们是 0,1,2,我预计是 123,234,345

2:标签应为“A 123”、“B 234”、“C 345”

  1. 没有选择的项目...

所以我收到了这个代码

<select ng-model="selectedVal" ng-options="v.label as v.number group by v.group for v in list" class="ng-pristine ng-valid">
    <option value="?" selected="selected"></option>
    <optgroup label="aa">
        <option value="0">123</option>
        <option value="1">234</option>
    </optgroup>
    <optgroup label="bb">
        <option value="2">345</option>
    </optgroup>
</select>

我期待

<select ng-model="selectedVal" ng-options="v.label as v.number group by v.group for v in list" class="ng-pristine ng-valid">
    <optgroup label="aa">
        <option value="123">A 123</option>
        <option value="234" selected>B 234</option>
    </optgroup>
    <optgroup label="bb">
        <option value="345">C 345</option>
    </optgroup>
</select>

请帮忙!

更新: 我还需要用 jQuery 序列化我的表单。所以我非常需要良好的选项值。

这里是提交的更新小提琴 http://jsfiddle.net/uwozaof9/2/

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    叉你的小提琴

    http://jsfiddle.net/uwozaof9/1/

    <div ng-controller="MyCtrl">
        <select ng-model="selectedVal" ng-options="v.number as (v.label + v.number) group by v.group for v in list">
        </select>
        {{selectedVal}}
    </div>
    

    如果你想序列化你的表单,你可以使用 track by 选项。检查

    http://jsfiddle.net/uwozaof9/5/

    但是您将无法设置模型。

    更多信息请查看https://docs.angularjs.org/api/ng/directive/ngOptions

    使用 select as 会将选择表达式的结果绑定到 模型,但和 html 元素的值将 可以是索引(对于数组数据源)或属性名称(对于 对象数据源)集合中的值。如果一个轨道通过 使用表达式,该表达式的结果将被设置为 选项和选择元素的值。

    【讨论】:

    • 谢谢!但值仍然是 0,1,2 而不是 123,234,345。我在上面发布了一个我需要的示例
    • 你检查过我的小提琴吗?值为 123、234、345
    • 问题是 - 我想在提交时使用 jQuery 序列化我的表单。通过提交jsfiddle.net/uwozaof9/2 查找我的更新
    • 对不起。我以为这就够了)
    • 现在没有选中项)
    【解决方案2】:

    我暂时用隐藏输入做了一个钩子

    这是一个有效的例子

    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <form id="aaa" ng-controller="MyCtrl">
        <input type="hidden" name="select" value="{{selectedVal}}">
        <select ng-model="selectedVal" ng-options="v.number as (v.label + v.number) group by v.group for v in list">
        </select>
        {{selectedVal}}
        <button ng-click="go()">go</button>
    </form>
    
    var myApp = angular.module('myApp', []);
    
    function MyCtrl($scope, $element) {
    
        console.log($('form'))
    
        $scope.selectedVal = 234;
        $scope.list = [
            {
            number: 123,
            label: "A",
            group: 'aa'},
        {
            number: 234,
            label: "B",
            group: 'aa'},
        {
            number: 345,
            label: "C",
            group: 'bb'},
            ];
    
            $scope.go = function(form){
               console.log($('form#aaa').serializeArray());
            }
    }
    

    http://jsfiddle.net/uwozaof9/4/

    【讨论】:

    • 将 dom 写入控制器是不好的做法。这将使您的控制器难以测试和重复使用。
    • 好的,就我而言,我使用 $element.serialize()。没事吧?
    • $element.serialize() 只不过是一个 dom 操作。如果你已经正确地学习了 Angular,那么你一定知道所有 DOM 部分都应该只使用指令。这就是我们在 Angular 或任何其他框架中使用指令的原因。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多