Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Aktualizacja danych w zmiennej i elemencie DOM
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
jutro
Witam

Chciałbym stworzyć prostą grę IDLE w javascripcie mam takie pytanie. Dane całej gry przechowuję w zmiennej, przykład:

  1. var data = {
  2. "value1": 4
  3. };


W htmlu mam takie małe okienko wyświetlające tę wartość np.

  1. <span id="value1">4</span>


Chciałbym aby po kliknięciu w button aktualizowała się wartość jednocześnie w zmiennej i elemencie. Czy coś takiego:

  1. $("value1").click(function() {
  2. data.value1 += 1;
  3. $("value1").text(data.value1);
  4. });


Pytanie czy to rozwiązanie jest poprawne czy może stosuje się inne metody? Dodam że elementów klikalnych będzie dość sporo.
Comandeer
Jest jeszcze coś, co nazywa się 2-way databinding, a co w JS de facto spopularyzował Angular.js (jedna z niewielu rzeczy, która im się udała… wink.gif): http://bzdety.comandeer.pl/binding/ → ale to już może być armata na muchę.

Chociaż zastosowanie Object.observe sprawiłaby, że mógłbyś se napisać prostą funkcję, dzięki której każda zmiana w obiekcie powodowałaby zmianą zawartości elementu HTML o [id] takim, jak nazwa własności obserwowanego obiektu. Z tym, że w chwili obecnej AFAIR Object.observe działa tylko w Chrome.

ALE! wink.gif Można go zastąpić w takim wypadku setterem dla własności w obiekcie, a to de facto działa wszędzie.
jutro
Angular chyba faktycznie odpada przy takim małym projekcie smile.gif

W ostatnim zdaniu miałeś na myśli coś w tym stylu?

  1. var data = {
  2. "value1": 2,
  3. "value2": 6
  4. };
  5.  
  6. function setValue(name, value) {
  7. data[name] += 1;
  8. $("#"+name).text(data[name]);
  9. };
  10.  
  11. $("button1").click(function(){
  12. setValue("value1", 1);
  13. });
Comandeer
Nie, raczej coś takiego: http://jsfiddle.net/Comandeer/2088qcdw/ → settery i gettery to "nowości" z ES5

Co do Angulara - nie mówiłem, żeby jego użyć (człowieku, jestem największym jego hejterem po tej stronie Wisły biggrin.gif). Raczej mówiłem o użyciu 2-way databinding.
ctom
a w Vuejs możesz zrobić to tak:

  1. <div id="app">
  2. <div v-on="click: up1">{{ value1 }}</div>
  3. </div>



[JAVASCRIPT] pobierz, plaintext
  1. new Vue({
  2. el: '#app',
  3. data: {
  4. value1: 10
  5. },
  6. methods: {
  7. up1: function(){
  8. this.value1++;
  9. }
  10. }
  11. });
[JAVASCRIPT] pobierz, plaintext
Comandeer
Jedno mnie w tym rozwiązaniu irytuje: po co to [v-on] skoro o wiele przejrzyściej byłoby to zrobić jako część konstruktora Vue?
jutro
@ctom wolałbym nie używać żadnych bibliotek.
@comandeer właśnie o to mi chodziło! To już enty raz jak ratujesz mnie przed żmudnym przepytywaniem googla bo "nie wiem jak to się nazywa". Dzięki smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.