Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: AngularJS: Mallin päivitys innerHTML:n muuttuessa?

faaraot [14.10.2016 11:42:41]

#

Vaikea selittää mutta jos joku pääsee ideasta kärrylle niin voi kysyä lisäki :)

Miten saan "päivitettyä" Seuraavan näppärästi. Ideana on että on kaksi select formia. Select1 on teksti ja Select2 kielenvaihto(. Samalla Select1 teksti näkyy erillisessä paikassa.

Select1 tiedot haetaan Ajaxilla php tiedostosta (lisää vain näitä lisää <option></option>.

Select1 tekstit vaihtuu hienosti kielestä toiseen mutta AngluraJS ei päivitä sitä toiseen paikkaan ennenkuin käyn vaihtamassa Select1 vaihtoehtoa toiseen.

Tähän pitäis saada joku refresh tai vastaava? Jquery(kokeiltu kaikenlaista)?

Tässä näytetään {{valitseteksti}}


<select class="valitseteksti" name="valitseteksti" id="valitseteksti" ng-model="valitseteksti">
</select>

<select class="kieli" name="kieli" id="kieli" onchange="haekieli(this.value);" >
 					 <option><? echo $lang['valitsekieli']; ?></option>
 					 <option value="fi"><? echo $lang['suomi']; ?></option>
					 <option value="en"><? echo $lang['english']; ?></option>
</select>
function haekieli(str) {
  		if (str.length == 0) {
        document.getElementById("valitseteksti").innerHTML = "<option></option>";
        return;
  	 	 } else {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {

                document.getElementById("valitseteksti").innerHTML = this.responseText;

            }
        }
		var $numero = $('#valitseteksti_hidden').val();
		if ($numero==null) {$numero='0';}
        xmlhttp.open("GET", "haku.php"+str+"&nykyinen_kielihaku="+$numero, true);
        xmlhttp.send();

   		 }
		};

Metabolix [15.10.2016 16:37:45]

#

Tuossa nyt vain korvaat selectin sisältämän HTML-koodin, joten on ihan turha odottaakaan, että mitään muuta tapahtuisi.

En tiedä tarkemmin AngularJS-filosofiasta, mutta ainakin tällainen näyttäisi toimivan:

var select = document.getElementById("valitseteksti")
var i = select.selectedIndex
select.innerHTML = xmlhttp.responseText
select.selectedIndex = i
select.dispatchEvent(new Event("change"))

Mango [15.10.2016 18:05:52]

#

En oikein ymmärrä miksi Angular on edes mukana jos sitä ei käytetä kuin yhteen implisiittiseen value bindiin? Se että joku scope-muuttuja ei päivity tai päivittyy yhden syklin myöhässä johtuu usein siitä että Angular-sovelluksen tilaa käpistellään Angularin ulkopuolelta ja digest-cycle ei triggeröidy. Quick'n'dirty ratkaisu tuollaisessa on triggeröidä scopen päivitys manuaalisesti:

$timeout(function() { $scope.$apply(); });

Mutta eipä tuossa ole edes yhtään kontrolleria johon tuollaisen hackin laittaisi (eikä sitä silloin edes tarvitsisi). Muutenkin jos Angular on mukana niin ajax-pyynnöt kannattaisi tehdä $http-servicellä ja selectin arvot asettaa ng-options direktiivillä. Varsinkin jälkimmäinen on tärkeä jos haluaa että modeli pysyy kärryillä kun optiot muuttuvat.

Tässä on nopea Angular toteutus konseptista, jos nyt yhtään ymmärsin sitä oikein: http://codepen.io/anon/pen/YGjLYR

Siinä on mockattu endpoint ajax-kutsulle "haetekstit.php?kieli=xx" joka palauttaisi valitun kielen tekstit json-listana.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta