ng-init
A Dokumentumok ezt mondja:
Ezzel az irányelvvel vissza lehet élni, hogy szükségtelen mennyiségű logikát adjunk a sablonokhoz. Az ngInitnek csak néhány megfelelő felhasználása létezik, például az ngRepeat speciális tulajdonságainak álnevezése, amint az az alábbi bemutatón látható; és adatok beszúrásához szerveroldali szkripteken keresztül. Ezen néhány eseten kívül az ngInit helyett vezérlőket kell használnia az értékek inicializálásához egy hatókörön.
Nem szabad init értékeket hozzárendelni a ng-init
használatával. A helyes módja ennek az lenne, ha az AngularJS controller
függvény végén hozzárendelik.
Technikailag az történik, hogy a ng-init
direktíva az ng-controller
függvény regisztrálása után kerül kiértékelésre. Ez az oka annak, hogy a ng-init
inicializált értékei nem érhetők el a vezérlőn belül.
Alapvetően a ng-controller
első hívás oka a prioritás. Ha megnézi a priority
direktívát, a ng-init
direktíva 450
és priority
direktívával rendelkezik, ahol a ng-controller
direktíva 500
, miközben a direktívát a DOM-ból fordítja AngularJS prioritások szerint rendezi őket. Így a ng-controller
kerül végrehajtásra először.
Kód
var app = angular.module("myApp", []);
app.controller("myCtrl", ["$scope",function($scope) {
console.log(test);
console.log(test1);
// If you wanted to assign the values dynamically you could make Ajax here
// that would call the server-side method which will return the values
// and in success that Ajax you could set those scope values.
// If any dependent function should get called after assigning them.
// Then you can call that function from that Ajax success.
$http.get('/getDefaultValues').then(function(response){
var data = response.data;
$scope.test= data.value1;
$scope.test1 = data.value2;
});
}]);
Szerkesztés
Mint úgy tűnik, a fenti kódot nem lehet megtenni, mert a változóértékek hozzárendelése a jsp
/aspx
oldalról történik. Emiatt egy másik módszert javaslok ennek elérésére. Szerintem ez tisztább módja ennek.
Azt javaslom, hogy lustán inicializálja a szögletes alkalmazást a angular.bootstrap
használatával, nem pedig a ng-app
használatával, amely az alkalmazást az oldal betöltésekor azonnal inicializálja.
angular.element(document).ready(function() {
angular.bootstrap(document, ['TodoApp']);
});
Most azon fog gondolkodni, hogyan lehetne megoldani azt a problémát, hogy a változót a hatókörhöz rendeljük a vezérlő elérhetővé tétele előtt, ebben az esetben létrehozhat egy értékobjektumot, és hozzárendelheti a jsp
/aspx
oldalon feltöltő változóhoz a value
(szolgáltatás típusa) )
<script type="text/javascript">
angular.element(document).ready(function() {
//like below you could get value inside your app by assigning
//to some angular component like constant/value
angular.module('TodoApp').value('sharedData', {
'test': @myValueFromAspxPage,
'test1': @myValueFromAspxPage1
});
angular.bootstrap(document, ['TodoApp']);
});
</script>
A fentiek elvégzésével könnyen elérhetővé teheti értékeit egy vezérlőn belül, és akkor nem kell várnia, amíg egy feldolgozási ciklus befejeződik a $timeout
használatával. Ezeket az értékeket a sharedData
értékbe injektálhatja úgy, hogy beadja a vezérlőbe.
22.10.2015
test='helloworld',test1='helloworld2
ezeket az értékeket dinamikusan generálja, sőt a vezérlő is dinamikusan adja hozzá. szóval hogyan passzoljam át 22.10.2015<div ng-controller="myCtrl" ng-init="test='helloworld';test1='helloworld2'"> </div>
. Az nginit értékek innen származnak:jsp
22.10.2015$http
hívást egy vezérlőről, és rendelje hozzá ezeket az értékeket közvetlenül magából a szögvezérlőből. 22.10.2015'test': @myValueFromAspxPage, 'test1': @myValueFromAspxPage1
ezt az értéket szeretné dinamikusan helyesen feltölteni. ha ez a helyzet, akkor az egyik összetevőnél fog működni. Van még két azonos szerkezetű alkatrészem. tehát ha hozzáadok még egy komponenst a meglévő alá, akkor új dinamikus értékek lesznek beállítva, és az első értékek lecserélődnek 29.10.2015adobe experience manager
a java cms-hez kapcsolódik. Mindenesetre pozitívan értékelem az erőfeszítéseidet 29.10.2015