Cómo crear una directiva, que establece los valores de ng-opciones?
-
26-12-2019 - |
Pregunta
Tengo seleccione los elementos que tienen las mismas opciones a través de toda la aplicación, pero puede parecer un poco diferente, por ejemplo,selecciona para usuario fecha de nacimiento (día, mes, año).
Es allí una manera de crear una directiva que proporcionan los valores de expresión de ng-options
?
E. g. <select my-options-months></select>
, donde my-options-months
iba a crear automáticamente las opciones con valores 1..12
el uso de ng-options
directiva.
Solución
Respuesta actualizada Su directiva como esta:
var myapp = angular.module('myapp', []);
myapp.controller('FirstCtrl', function ($scope) {
$scope.selectedMonth = 3
})
.directive('myOptionsMonths', function ($compile) {
return {
priority: 1001, // compiles first
terminal: true, // prevent lower priority directives to compile after it
compile: function (element, attrs) {
element.attr("ng-options", "m for m in months");
element.removeAttr('my-options-months'); // necessary to avoid infinite compile loop
var fn = $compile(element);
return function (scope) {
scope.months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
fn(scope);
};
}
}
})
Por favor, comprobación de trastear con el ejemplo http://jsfiddle.net/KN9xx/39/
Otros consejos
Si usted está planeando crear un rango de valores en seleccionar acaba de poner en una plantilla.Y si la serie tiene que ser dinámica sólo enlace a un atributo en una directiva.
app.directive('myOptionsMonths', function(){
return {
scope: {
myOptionsMonths:"@"
},
link: function(scope,e, a){
var N = +a.myOptionsMonths;
scope.values = Array.apply(null, {length: N}).map(Number.call, Number);
},
template: "<select ng-model='t' ng-options='o for o in values'></select>"
};
});
<my-options-months my-options-months="10"></my-options-months>
puede ser con un enfoque diferente con un filtro como:
.filter('range', function () {
return function (input, min, max, padding){
min = parseInt(min);
max = parseInt(max);
padding = padding ? padding : false;
for (var i=min; i<=max; i++){
input.push(padding ? ("00" + i).slice (-2) : i + '');
}
return input;
};
})