Dies ist ein häufiger Fehler bei neuen Angular-Anwendungen. Sie möchten Ihre Werte nicht in Ihren HTML-Code auf dem Server schreiben, wenn Sie dies vermeiden können. Umso besser, wenn Sie es vermeiden können, dass Ihr Server HTML vollständig rendert.
Idealerweise möchten Sie Ihre Angular-HTML-Vorlagen versenden, dann Ihre Werte über $ http in JSON abrufen und in Ihren Bereich einfügen.
Wenn möglich, machen Sie Folgendes:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Wenn Sie Ihre Werte unbedingt von Ihrem Server in Ihren HTML-Code rendern MÜSSEN, können Sie sie in eine globale Variable einfügen und mit $ window darauf zugreifen:
In die Kopfzeile Ihrer Seite würden Sie schreiben:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
Und dann würden Sie es in Ihrem Controller so bekommen:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
Ich hoffe das hilft.
Wenn Sie Ihre App nicht überarbeiten können, um das zu tun, was @blesh vorschlägt (JSON-Daten mit $ http oder $ resource nach unten ziehen und $ scope auffüllen), können Sie stattdessen ng-init verwenden:
Siehe auch AngularJS - Wertattribut in einem Eingabetextfeld wird ignoriert, wenn ein ng-Modell verwendet wird.
quelle
ng-init
-Webformularen und finde, dass die Verwendung sehr nützlich ist, wenn Werte aus Code-Behind / Postback festgelegt werden<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. Etwas hässlich? Ja, aber der Trick & löst dabei Integrationsprobleme.Dies ist eine offensichtlich fehlende, aber leicht hinzuzufügende Lösung für AngularJS. Schreiben Sie einfach eine Kurzanweisung, um den Modellwert aus dem Eingabefeld festzulegen.
Hier ist meine Version:
quelle
controller
für Ihre Direktive definiert und warum haben Sie dielink
Methode nicht verwendet ? Ich bin Neuling bei Angularjsval = $attrs.ngInitial || $attrs.value || $element.val()
damit es mit ausgewählten Elementen funktioniert.IMHO ist die beste Lösung die @ Kevin Stone-Direktive, aber ich musste sie aktualisieren, um unter allen Bedingungen (zB select, textarea) zu funktionieren, und diese funktioniert mit Sicherheit:
quelle
Sie können eine benutzerdefinierte Direktive verwenden (mit Unterstützung für Textbereich, Auswahl, Radio und Kontrollkästchen). Lesen Sie diesen Blog-Beitrag unter https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- Felder-Attribute / .
quelle
Sie können auch in Ihrem HTML-Code Folgendes verwenden:
ng-init="card.description = 12345"
Es wird von Angular nicht empfohlen, und wie oben erwähnt, sollten Sie ausschließlich Ihren Controller verwenden.
Aber es funktioniert :)
quelle
Ich habe einen einfachen Ansatz, weil ich einige umfangreiche Validierungen und Masken in meinen Formularen habe. Also habe ich jquery verwendet, um meinen Wert wieder zu erhalten und das Ereignis "change" auf Validierungen auszulösen:
quelle
Wie andere betonten, ist es nicht empfehlenswert, Daten in Ansichten zu initialisieren. Es wird jedoch empfohlen, Daten auf Controllern zu initialisieren. (siehe http://docs.angularjs.org/guide/controller )
So können Sie schreiben
und
Auf diese Weise enthalten die Ansichten keine Daten, und der Controller initialisiert den Wert, während die realen Werte geladen werden.
quelle
Wenn Ihnen der Ansatz von Kevin Stone über https://stackoverflow.com/a/17823590/584761 gefällt, sollten Sie einen einfacheren Ansatz in Betracht ziehen, indem Sie Anweisungen für bestimmte Tags wie "Eingabe" schreiben.
Wenn Sie diesen Weg gehen, müssen Sie sich nicht darum kümmern, jedem Tag ng-initial hinzuzufügen. Der Wert des Modells wird automatisch auf das Wertattribut des Tags gesetzt. Wenn Sie das Wertattribut nicht festlegen, wird standardmäßig eine leere Zeichenfolge verwendet.
quelle
Hier ist ein serverzentrierter Ansatz:
Dies ist die gleiche Grundidee wie die gängigsten Antworten auf diese Frage, außer dass $ require.value einen Dienst registriert, der Ihre Standardwerte enthält.
Auf dem Server könnten Sie also Folgendes haben:
Und fügen Sie es über die serverseitige Technologie Ihrer Wahl in Ihre Seite ein. Hier ist eine Zusammenfassung: https://gist.github.com/exclsr/c8c391d16319b2d31a43
quelle
Dies ist eine allgemeinere Version der oben genannten Ideen ... Es wird lediglich geprüft, ob das Modell einen Wert enthält, und wenn nicht, wird der Wert auf das Modell festgelegt.
JS:
HTML (Anwendungsbeispiel):
quelle
$scope
zum Anrufgetter()
übergegangen bin - hoffe, das klärt die Dinge für alle anderen, die dies versuchen!Ich habe versucht, was @ Mark Rajcok vorgeschlagen hat. Es funktioniert für String-Werte (Visa-4242). Bitte beziehen Sie sich auf diese Geige .
Aus der Geige:
Das gleiche, was in der Geige gemacht wird, kann mit gemacht werden
ng-repeat
, was jeder empfehlen kann. Aber nachdem ich die Antwort von @Mark Rajcok gelesen hatte, wollte ich dasselbe nur für ein Formular mit einer Reihe von Profilen versuchen. Die Dinge funktionieren gut, bis ich die $ scope.profiles = [{}, {}] habe; Code in der Steuerung. Wenn ich diesen Code entferne, bekomme ich Fehler. Aber in normalen Szenarien kann ich nicht drucken,$scope.profiles = [{},{}];
während ich HTML vom Server drucke oder wiedergebe. Wird es möglich sein, das oben Genannte auf ähnliche Weise wie @Mark Rajcok für die Zeichenfolgenwerte wie auszuführen<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, ohne den JavaScript-Teil vom Server wiederholen zu müssen?quelle
Gerade Unterstützung für ausgewähltes Element zu Ryan Montgomery "Fix" hinzugefügt
});
quelle
Wenn Sie den Init-Wert in der URL wie haben
mypage/id
, können Sie im Controller des eckigen JSlocation.pathname
die ID suchen und sie dem gewünschten Modell zuweisen.quelle