javascript angularjs angularjs-directive

javascript - ng-model angularjs



AngularJS-¿Es posible cambiar el valor de ngModel attribute on directive en link o compile? (2)

Debería ver los documentos del NgModelController . Responderá a tu pregunta. Para una explicación más detallada, esta es la esencia:

Puede capturar un cuarto argumento para la función link: que es su valor de ng-model . Usas ese objeto para leer y configurar el modelo.

link: function(scope, element, attrs, ngModel) { if(!ngModel) return; // do nothing if no ng-model // Specify how UI should be updated ngModel.$render = function() { element.html(ngModel.$viewValue || ''''); }; // Listen for change events to enable binding element.on(''blur keyup change'', function() { scope.$apply(read); }); read(); // initialize // Write data to the model function read() { var html = element.html(); // When we clear the content editable the browser leaves a <br> behind // If strip-br attribute is provided then we strip this out if( attrs.stripBr && html == ''<br>'' ) { html = ''''; } ngModel.$setViewValue(html); } }

Espero que ayude.

Estoy intentando crear una directiva que agregará un atributo ngModel a una etiqueta basada en el valor del atributo. Por ejemplo:

angular.module(''myModule''). directive(''myDirective'', function() { return { link: function(scope, elem, attrs) { var modelName = ''myPrefix.'' + attrs.name; attrs.$set(''ngModel'', modelName); } }; });

Para que este html:

<input name="foo" my-directive></input>

está compilado en

<input name="foo" ng-model="myPrefix.foo" my-directive></input>

Toma el nombre de la entrada, agrega un prefijo y establece el atributo ngModel en ese valor.

Cuando trato de hacer esto en la función de enlace, parece que la input no se está registrando con formController, por lo que form.foo devuelve indefinido.

¿Es posible lograr lo que intento hacer?

EDITAR:

Parece que el atributo ngModel se establece en el HTML, pero no se está registrando con el formulario, o ngModelController no se está creando una instancia. Si miro el valor de ngModel en el alcance, no cambia cuando ngModel la entrada.


Pude lograr el objetivo mediante el uso de una función de plantilla. Creo que no funciona en la función de enlace porque ocurre después de que se hayan recopilado todas las directivas, por lo que el compilador no reconoce que se ha agregado una directiva ngModel . Sin embargo, no estoy seguro de por qué no funciona en la función de compilación (incluso si configuro la prioridad en 100).

Aquí está la versión de trabajo de la directiva:

angular.module(''myModule''). directive(''myDirective'', function() { return { replace: true, template: function(elem, attr) { var newElem = ''<input ng-model="model.'' + attr.name + ''">''; return newElem; } }; });