2012-06-19 18 views
14

Uso angularjs a menudo artículos como NG-clic o ng-modelo se escriben directamente en el elemento de formulario HTML como tal ....integración angularjs con Ruby On Rails Forms

<input type="text" ng-model="name"> 

¿Cómo me hacer eso con rieles? Como se utiliza rieles rubí incrustado y genera el código HTML ....

<%= form_for(@user) do |f| %> 
<%= f.label :name %> 
<%= f.text_field :name %> 

¿Cómo puedo añadir el ng-modelo para <% = f.text_field:% name>?

Respuesta

27

Idealmente, usted no quiere ser la mezcla de interpolación rubí incrustado e interpolación de angular. Es mejor que ruby ​​asincrónicamente sirva JSON a Angular, y deje que Angular se encargue de completar los datos en el lado del cliente.

+0

Sí, después de pensar en esto, creo que tiene sentido el código de los sentidos. – HelloWorld

+1

¿Puedes ampliar esto un poco? Tengo una forma compleja con 2 niveles de subformularios que estoy convirtiendo a Angularjs. Los subformularios están contenidos en parciales de rieles. La única forma en que puedo ver hacer esto en AngularJs es mover todos mis parciales fuera del directorio '/ views/model' y rehacerlos como archivos html simples (usando ngRoute para acceder) en el directorio javascript - ¿es este el mejor forma de hacerlo? Entonces perdería toda la funcionalidad del formulario como una alternativa si Angular no funciona. También necesitará codificar a mano en muchos elementos de formulario ... ¿tal vez lo estoy viendo mal? – FireDragon

0

Creo que puede usar la opción: html para establecer los atributos de los elementos. no lo han intentado con atributos especiales angularjs aunque ;-)

f.text_field :name, :html => { :ng-model => "name" }

+0

genial le dará una oportunidad – HelloWorld

+0

no funcionó :( – HelloWorld

+0

pase el hash de opciones html con la porción de valor, no la tecla 'html', es decir' f.text_field: name,: ng-model => "name" ' – zetetic

8

Pruebe esto, cuando se trata de una palabra separada por un guión, debe poner dentro de una notación hash.

f.text_field :name, :ng => {:model => "name"} 
+4

también puede usar una clave de cadena: '" ng-model "=>" name "' – Mikey

+3

o 'ng_model:" name "' – gertas

+0

@MurifoX Funciona para un formulario nuevo, y ¿qué tal si edita el formulario existente? No completa el valor existente correctamente? – Samnang

3

estaba trabajando con AngularJS directivas y los carriles 4 a fin de que el sistema de arranque-selector de fechas de trabajo jQuery plugin en una plantilla erb carriles 4, el código que he utilizado en el interior del text_field_tag es la siguiente:

<%= text_field_tag(:start_day, nil, class: 'form-control', datepicker: 'datepicker') %> 

es importante tener en cuenta que esto funciona con AngularJS directivas, el código que se obtiene en el DOM es el siguiente:

<input class="form-control" datepicker="datepicker" type="text"> 

trabajé con el di rective de la siguiente manera:

timeAdminCal.directive('datepicker', function(){ 
     return { 
     restrict: 'A', 
     link: function ($scope, $element) { 
      $element.datepicker({ 
      format: 'd/m/yyyy', 
      autoclose: true, 
      todayHighlight: true 
      }); 
     } 
     } 
    }); 

en cuenta que, de acuerdo con AngularJS directive docs que pueda restrict un nombre de clase, por lo que puede usar cualquier nombre de la clase en su text_field_tag y funcionará también.

timeAdminCal.directive('datepicker', function(){ 
     return { 
     restrict: 'C', // Bind DOM element by class name 'datepicker' 
     link: function ($scope, $element) { 
      $element.datepicker({ 
      format: 'd/m/yyyy', 
      autoclose: true, 
      todayHighlight: true 
      }); 
     } 
     } 
    }); 
3

Lo siguiente es lo que funcionó para mí (Pero va a desactivar mensaje de error ("Por favor, introduzca su nombre.") De AngularJS, es decir required: "required"):

<%= f.input :id, as: :select, label: false, prompt: 'Select a selection', input_html: { "ng-model" => ""} %> 
0

En mi proyecto actual, que tenía para comenzar a transformar las plantillas estáticas en páginas angulosas, lo que hice fue representar las vistas de jbuilder dentro de la plantilla y ponerlas en ng-init.

Si la pantalla alguna vez se convierte en parte de una aplicación de una sola página, simplemente tendré que eliminar esa representación y agregar una consulta a la API para cargar esos datos. Así es como Twitter lo hace, y es simple y efectivo.

0

Si usa ng-model, esto significa que sobrescribe el comportamiento form_for para objetos. Por ejemplo, si tiene

= form_for :user do |f| 
    = f.text_field :username, 'ng-model': user.username 

Esto significa que el campo de texto no representará el valor pasado por el controlador de rieles. Debe agregar el valor del nombre de usuario al modelo angular dentro del controlador angular.