Jest to częsty błąd w nowych aplikacjach Angular. Nie chcesz zapisywać swoich wartości w kodzie HTML na serwerze, jeśli możesz tego uniknąć. W rzeczywistości, jeśli możesz uciec od całkowitego renderowania kodu HTML przez serwer, tym lepiej.
Idealnie byłoby, gdybyś chciał wysłać szablony Angular HTML, a następnie ściągnij swoje wartości przez $ http w formacie JSON i umieść je w swoim zakresie.
Więc jeśli to możliwe, zrób to:
app.controller('MyController', function($scope, $http) {
$http.get('/getCardInfo.php', function(data) {
$scope.card = data;
});
});
<input type="text" ng-model="card.description" />
Jeśli absolutnie MUSISZ wyrenderować swoje wartości do kodu HTML ze swojego serwera, możesz umieścić je w zmiennej globalnej i uzyskać do nich dostęp za pomocą $ window:
W nagłówku swojej strony napisałbyś:
<head>
<script>
window.card = { description: 'foo' };
</script>
</head>
A potem w kontrolerze otrzymasz to w ten sposób:
app.controller('MyController', function($scope, $window) {
$scope.card = $window.card;
});
Mam nadzieję że to pomogło.
Jeśli nie możesz przerobić swojej aplikacji, aby zrobić to, co sugeruje @blesh (ściągnij dane JSON za pomocą $ http lub $ zasób i wypełnij $ scope), możesz zamiast tego użyć ng-init :
Zobacz także AngularJS - atrybut wartości w wejściowym polu tekstowym jest ignorowany, gdy używany jest model ng?
źródło
ng-init
jest bardzo przydatne podczas ustawiania wartości z kodu związanego / postback np<input name="phone" data-ng-model="frm.phone" data-ng-init="frm.phone= '<%: Model.Phone %>'" data-ng-pattern="/^[0-9() \-+]+$/" type="tel" required />
. Trochę brzydki? Tak, ale rozwiązuje problem i rozwiązuje problem związany z integracją.Jest to oczywiście brakująca, ale łatwa do dodania poprawka dla AngularJS. Po prostu napisz szybką dyrektywę, aby ustawić wartość modelu z pola wejściowego.
Oto moja wersja:
źródło
controller
dla swojej dyrektywy i dlaczego nie użyłeś tejlink
metody ?. Jestem nowicjuszem w angularjsval = $attrs.ngInitial || $attrs.value || $element.val()
na, aby działał z wybranymi elementami.IMHO najlepszym rozwiązaniem jest dyrektywa @Kevin Stone, ale musiałem ją zaktualizować, aby działała w każdych warunkach (np. Select, textarea), a ten na pewno działa:
źródło
Możesz użyć niestandardowej dyrektywy (z obsługą textarea, select, radio i checkbox), sprawdź ten post na blogu https://glaucocustodio.github.io/2014/10/20/init-ng-model-from-form- pola-atrybuty / .
źródło
Możesz również użyć w swoim kodzie HTML:
ng-init="card.description = 12345"
Nie jest to zalecane przez Angular i jak wspomniano powyżej, powinieneś używać wyłącznie swojego kontrolera.
Ale to działa :)
źródło
Mam proste podejście, ponieważ w moich formularzach mam kilka ciężkich walidacji i masek. Użyłem więc jquery, aby ponownie uzyskać moją wartość i uruchomić zdarzenie „change” na walidacje:
źródło
Jak wskazywali inni, nie jest dobrą praktyką inicjowanie danych w widokach. Zalecane jest jednak zainicjowanie danych na kontrolerach. (patrz http://docs.angularjs.org/guide/controller )
Więc możesz pisać
i
W ten sposób widoki nie zawierają danych, a sterownik inicjalizuje wartość podczas ładowania wartości rzeczywistych.
źródło
Jeśli podoba Ci się podejście Kevina Stone'a powyżej https://stackoverflow.com/a/17823590/584761, rozważ łatwiejsze podejście, pisząc dyrektywy dla określonych tagów, takich jak „dane wejściowe”.
Jeśli wybierzesz tę trasę, nie będziesz musiał się martwić dodawaniem ng-initial do każdego tagu. Automatycznie ustawia wartość modelu na atrybut value tagu. Jeśli nie ustawisz atrybutu wartości, domyślnie będzie to pusty ciąg.
źródło
Oto podejście skoncentrowane na serwerze:
Jest to ta sama podstawowa idea, co w bardziej popularnych odpowiedziach na to pytanie, z wyjątkiem $ include.value rejestruje usługę, która zawiera domyślne wartości.
Więc na serwerze mógłbyś mieć coś takiego:
I umieść go na swojej stronie za pomocą wybranej przez siebie technologii po stronie serwera. Oto streszczenie: https://gist.github.com/exclsr/c8c391d16319b2d31a43
źródło
Ten jest bardziej ogólną wersją pomysłów wymienionych powyżej ... Po prostu sprawdza, czy w modelu jest jakaś wartość, a jeśli nie, ustawia wartość na model.
JS:
HTML (przykład użycia):
źródło
$scope
wezwaniagetter()
- mam nadzieję, że to wyjaśni wszystko dla każdego, kto spróbuje tego!Wypróbowałem to, co zasugerował @Mark Rajcok. Działa dla wartości String (Visa-4242). Proszę, odnieś to skrzypce .
Od skrzypiec:
To samo, co robi się na skrzypcach, można zrobić za pomocą
ng-repeat
, co każdy mógłby polecić. Ale po przeczytaniu odpowiedzi udzielonej przez @Marka Rajcok chciałem po prostu wypróbować to samo dla formularza z szeregiem profili. Wszystko działa dobrze, dopóki nie mam $ scope.profiles = [{}, {}]; kod w sterowniku. Jeśli usunę ten kod, otrzymuję błędy. Ale w normalnych scenariuszach nie mogę drukować$scope.profiles = [{},{}];
tak, jak drukuję, ani odczytywać HTML z serwera. Czy będzie możliwe wykonanie powyższego w podobny sposób, jak @Mark Rajcok dla wartości łańcuchowych<input name="card[description]" ng-model="card.description" ng-init="card.description='Visa-4242'">
, bez konieczności powtarzania części JavaScript z serwera.źródło
Właśnie dodałem obsługę wybranego elementu do „naprawy” Ryana Montgomery'ego
});
źródło
Jeśli masz wartość init w adresie URL, jak na przykład
mypage/id
, w kontrolerze kątowego JS możeszlocation.pathname
znaleźć id i przypisać go do wybranego modelu.źródło