2012-06-19 11 views
14

Mit Angularjs häufig Elemente wie ng Klick oder ng-Modell ist wie so direkt in dem HTML-Formularelement geschrieben ....Angularjs Integration mit Ruby On Rails Forms

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

Wie würde ich Mach das mit Schienen? Wie nutzen Schienen eingebettet Rubin und erzeugen die html ....

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

Wie würde ich das ng-Modell zu <% = f.text_field hinzu: name%>?

Antwort

27

Idealerweise verfügen Sie wollen nicht eingebettet Rubin Interpolation und Angular der Interpolation sein Mischen. Es ist besser, wenn Ruby asynchron JSON an Angular liefert und Angular die Daten auf der Clientseite ausfüllt.

+0

Ja, nachdem ich darüber nachgedacht habe, denke ich, dass das Code-weise sinnvoll ist. – HelloWorld

+1

Kannst du das etwas erweitern? Ich habe eine komplexe Form mit 2 Ebenen von Unterformularen, die ich in Angularjs umwandeln möchte. Die Teilformulare sind in Teiltafeln enthalten. Der einzige Weg, wie ich das in AngularJs sehen kann, ist, alle meine Partials aus dem '/ views/model'-Verzeichnis zu entfernen und sie als reine HTML-Dateien (mit ngRoute für den Zugriff) im Javascript-Verzeichnis neu zu erstellen - ist das das Beste Weg, es zu tun? Dann würde ich alle Funktionalität des Formulars als Fallback verlieren, wenn Angular nicht funktioniert. Auch muss in vielen Formelementen handcodiert werden ... vielleicht sehe ich es falsch an? – FireDragon

0

Ich denke, dass Sie die HTML-Option verwenden können, um beliebige Elementattribute festzulegen. Habe es nicht mit Angularjs speziellen Attribute versucht obwohl ;-)

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

+0

cool wird geben, dass ein Versuch – HelloWorld

+0

hat nicht funktioniert :( – HelloWorld

+0

übergeben Sie die HTML-Optionen Hash mit dem Wert Teil, nicht der 'html' Schlüssel, dh' f.text_field: name,: ng-model => "name" ' – zetetic

8

Versuchen Sie dies, wenn es sich um ein Bindestrich getrennt Wort handelt, müssen Sie in eine Hash-Notation setzen.

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

Sie können auch einen String-Schlüssel verwenden: '" ng-model "=>" name "' – Mikey

+3

oder 'ng_model:" name "' – gertas

+0

@MurifoX Es funktioniert für neues Formular, und wie wäre es mit bestehenden Formular bearbeiten? Der vorhandene Wert wird nicht korrekt ausgefüllt? – Samnang

3

Ich war mit AngularJS Richtlinien arbeiten und Schienen 4, um die Bootstrap-picker jQuery-Plugin Arbeit an einem Rails 4 erb Vorlage zu machen, der Code, den ich in der text_field_tag verwendet wird, ist der folgende:

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

Es ist wichtig zu bemerken, dass dies mit AngularJS Richtlinien arbeitet, der Code, den Sie auf dem DOM ist wie folgt:

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

ich mit dem di gearbeitet rective auf folgende Weise:

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

Hinweis, dass nach AngularJS directive docs können Sie restrict einen Klassennamen, so dass Sie auf Ihrem text_field_tag jede Klassennamen verwenden kann, und es wird auch funktionieren.

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

Hier finden Sie was für mich gearbeitet (Aber es wird Fehlermeldung („Bitte geben Sie den Namen.“ Deaktivieren) von AngularJS, dh required: "required"):

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

Auf meinem aktuellen Projekt, hatte ich Um statische Templates in eckige Seiten zu transformieren, habe ich jbuilder views innerhalb der Template gerendert und in ng-init abgelegt.

Wenn der Bildschirm jemals Teil einer einzelnen Seite App wird, muss ich einfach das Rendern entfernen und eine Abfrage an die API hinzufügen, um diese Daten zu laden. So macht Twitter es, und es ist einfach und effektiv.

0

Wenn Sie ng-model verwenden, bedeutet dies, dass Sie das form_for-Verhalten für Objekte überschreiben. Wenn Sie beispielsweise

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

haben, bedeutet das, dass das Textfeld den vom rails Controller übergebenen Wert nicht rendern wird. Sie müssen den Wert des Benutzernamens zum Winkelmodell im Winkelregler hinzufügen.