Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.06.2016, 12:28
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

Скоуп в JS ООП
Добрый день.

Делаю форму. Создала автозаполнение города, страны и региона данными. Проблема в том, что я присваиваю переменной значение, вывожу его в консоли (работает), но когда пытаюсь записать эти же данные из другой части программы - ничего не получается.
var forma = {
	model:{
	    userLocationCity: "",
	    userLocationCountry: "",
	    userLocationRegion: "",
	    getUserLocation: function(){
	    	$.getJSON('http://ipinfo.io', function(data) {
                if (data) {// If data exist.
				    forma.model.userLocationCity = data.city;
				    console.log(forma.model.userLocationCity);//Work
				    forma.model.userLocationCountry = data.country;
				    forma.model.userLocationRegion = data.region;
                } else {
                
                }
            });
	    }		
	},
	view:{
		render: function(){
			//Put data from the model in the form.
			$("input[name~='country']").val("Ukraine"); //Works.
			$("input[name~='city']").val(forma.model.userLocationCity); //Doesn't work
			$("input[name~='region']").val(forma.model.userLocationRegion); //Doesn't work
			alert("It's allive! "+forma.model.userLocationCountry); //Doesn't work
		}
	},
	controller: {
		init: function(){
			forma.model.getUserLocation();
			forma.view.render();
			
		}
	}

};


forma.controller.init();

<form method="POST" action="">
            <input type="text" name="name" placeholder="John" required />
		    <input type="text" name="surname" placeholder="Smith" required />
			<hr/><!--Put the data from JS-model inside-->
		    <input type="text" name="country" placeholder="USA" required />
			<input type="text" name="region" placeholder="California" required />
			<input type="text" name="city" placeholder="Mountain View" required />
			
			<input type="submit" value="Finish him!">
		</form>

Почему не работает?
Ответить с цитированием
  #2 (permalink)  
Старый 11.06.2016, 13:21
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Blondinka,
А так нельзя?
var forma = {
	model:{
	    userLocationCity: "",
	    userLocationCountry: "",
	    userLocationRegion: "",
	    getUserLocation: function(){
	    	$.getJSON('http://ipinfo.io', function(data) {
                if (data) {// If data exist.
	 forma.model.userLocationCity = data.city;
				    console.log(forma.model.userLocationCity);//Work
				    forma.model.userLocationCountry = data.country;
				    forma.model.userLocationRegion = data.region;
                                    forma.view.render();
                } else {
                
                }
            });
	    }		
	},
	view:{
		render: function(){
			//Put data from the model in the form.
			$("input[name~='country']").val("Ukraine"); //Works.
			$("input[name~='city']").val(forma.model.userLocationCity); //Doesn't work
			$("input[name~='region']").val(forma.model.userLocationRegion); //Doesn't work
			alert("It's allive! "+forma.model.userLocationCountry); //Doesn't work
		}
	},
	controller: {
		init: function(){
			forma.model.getUserLocation();			
		}
	}

};
forma.controller.init();
Ответить с цитированием
  #3 (permalink)  
Старый 11.06.2016, 14:03
Профессор
Отправить личное сообщение для Blondinka Посмотреть профиль Найти все сообщения от Blondinka
 
Регистрация: 21.03.2014
Сообщений: 173

destus, так работает, но хочу понять почему данные переменной не отображаются при вызове её из view.
Ответить с цитированием
  #4 (permalink)  
Старый 11.06.2016, 14:05
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Blondinka,
потому что так устроен асинхронный мир
Ответить с цитированием
  #5 (permalink)  
Старый 11.06.2016, 14:36
Аватар для Coriolan161
Профессор
Отправить личное сообщение для Coriolan161 Посмотреть профиль Найти все сообщения от Coriolan161
 
Регистрация: 21.11.2015
Сообщений: 440

Blondinka,
В процессе работы скрипта

1) у тебя при вызове getUserLocation происходит запрос данных.

2) ты не блокируешь исполнение кода, благодаря колбеку function (data) {}

3) Выполнение не останавливается и происходит вызов view.render(). А он берет userLocationCity == ""

Короче у тебя строки userLocationCity и т.д не обновляются.
Поэтому сделай так как МиккиМаус предложил.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
js стиль render для react.js vflash Ваши сайты и скрипты 5 01.04.2016 22:57
Вакансия JavaScript разработчик / JS / Frontend developer (Санкт-Петербург) Сергей Грачёв Работа 0 21.09.2015 12:31
немного ООП на JS Nightmare Общие вопросы Javascript 6 11.09.2011 20:50
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28
Срочно JS developer okp Работа 13 23.08.2011 16:16