2016-09-18 90 views
0

我想要一个指令,它把ngrange取代为[ - 3,3]到ng-options。角度不正确的编译选项

不幸的是下面的解决方案是不好

<html lang="pl"> 
<head> 
    <title>Its directive range</title> 
</head> 
<body> 
    <div ng-app="app">  
     <div ng-controller="AppCtrl"> 
      <select ng-model="value" range="[-3, 3]"></select> 
      <span>{{value}}</span> 
     </div> 
    </div>  

    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script> 
    <script type="text/javascript"> 
     angular.module('directives', []); 

     angular.module('app', ['directives']); 

     angular.module('app').controller('AppCtrl', function($scope) { 
      $scope.value = 2; 
     }); 

     angular.module('directives').directive('range', function($compile) { 
      return { 
       restrict: 'A', 
       scope: { 
        range: '=' 
       }, 
       link: function(scope, elem, attr) { 
        scope.options = []; 

        for(var i = scope.range[0]; i <= scope.range[1]; ++i) { 
         scope.options.push(i); 
        } 

        elem.attr('ng-options', 'o as o for o in options track by o'); 

        elem.removeAttr('range'); 

        $compile(elem)(scope); 
       } 
      }; 
     }); 
    </script> 
</body> 

后创建NG选项标签选择包含期权价值= “号:2”,而不是选择值2 ...

+0

我创建plunker你的代码,但不能复制上述问题,呈现的HTML是: – Andriy

+0

plunker:http://plnkr.co/edit/W0Uz9t4bnGh6feVqBYP4?p=preview – Andriy

+0

我在控制器中设置$ scope.value = 2,但它没有选择选项...并创建了值为“number:2”的选项... – smiady

回答

0

ng-options指令可以选择不同类型的变量,它可以选择混合类型,如:

<select name="mydata" 
     ng-model="number" 
     ng-options="value.a || value for value in ['-10', -5, 0, 5,'10',{a: '20'},'25']"> 

其中第一,第五和最后一个项目是STRING秒,一个项目前的最后是OBJECT和物品的其余部分是NUMBER秒。在HTML这些选项呈现像:

<select name="mydata" 
     ng-model="number" ng-options="value.a || value for value in ['-10', -5, 0, 5,'10',{a: '20'},'25']"> 
    <option label="-10" value="string:-10">-10</option> 
    <option label="-5" value="number:-5">-5</option> 
    <option label="0" value="number:0">0</option> 
    <option label="5" value="number:5">5</option> 
    <option label="10" value="string:10" selected="selected">10</option>  
    <option label="20" value="object:8">20</option> 
    <option label="25" value="string:25">25</option> 
</select> 

到不同类型之间,用分号类型本身的值之前加入,如number:5object:4,这些类型的前缀,通过该被更新NG-模型忽略正确的,请参阅plunker http://plnkr.co/edit/THIriUsSRMV3PPGvd8oN?p=preview

我改变了你的号码范围为字符串的范围,使其类似于天然HTML选择元素:

for (var i = scope.range[0]; i <= scope.range[1]; i++) { 
    scope.options.push((i).toString()); 
} 

类型前缀在这种情况下省略了,只在初始加载有<option value="? string:2 ?"></option>元,其中在第一次手动选择后被删除。

+0

在第一次手动选择之前,有值为string的选项:2。我试着找到解决这个问题的方法,或许在Angular中存在用于手动选择的方法?P – smiady

+0

我尝试了ngModelController。$ render()和jQuery.val()。trigger('change'),但没有成功... – Andriy