通过' select'在指令中转换自定义选项元件

时间:2016-11-25 15:43:26

标签: javascript angularjs angularjs-ng-transclude

我有一个通用的指令,它包含一个带有一组通过ajax加载(后来被缓存)的选项的选项。

问题是我需要指定一些特定选项,具体取决于使用此指令的位置。我以为我可以转发这样的选项:

<select-directive ng-model="model">
    <option value="x">custom option</option>
</select-directive>

指令为:

{
            restrict: 'E',
            scope:{
                ngModel: '='
            },
            transclude:true,
            template:[
                '<select class="tipos" ng-model="ngModel">',
                    '<ng-transclude></ng-transclude>',
                    '<option ng-selected="ngModel === item.tipo" ng-repeat="item in ::tiposDoc track by item.tipo" value="{{::item.tipo}}" title="longer description">',
                        'description',
                    '</option>',
                '</select>'
            ].join(''),
            link: function(scope){
                $http.get('viewApp/viewCtrl.php/getTipos',{cache:true})
                    .then(function(response){
                        var resp = response.data;
                        if(!resp.success){
                            console.log(resp.log);
                            alert(res.msg);
                            return false;
                        }
                        scope.tiposDoc = resp.result;
                    });
            }
        }

但自定义选项不会出现在select元素中。我错过了什么吗?这有可能以某种方式吗?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

link: function(scope, element, attrs, ctrls, transclude){
    var html = transclude();
    element.find('select').append(html);
}

答案 1 :(得分:1)

显然ng-include标记在某种程度上与angular select指令冲突,因此我最终使用的解决方法是包含optgroup ng-transclude属性,幸运的是它起作用了:

...
template:[
                '<select class="tipos" ng-model="ngModel">',
                    '<optgroup ng-transclude></optgroup>',
                    '<optgroup>',
                        '<option ng-selected="::ngModel === item.tipo" ng-repeat="item in ::tiposDoc track by item.tipo" value="{{::item.tipo}}" title="{{::item.tipoydesc}}">',
                            '{{::item.tipoydesc}}',
                        '</option>',
                    '</optgroup>',
                '</select>'
            ].join(''),
...

Maximus的答案也很好用,但我无法将某些功能与自定义选项配合使用。