• Почему TypeScript срабатывает только после обновления страницы?

    ermolaevalexey
    @ermolaevalexey
    frontend веб-разработчик
    Ну, во-первых, typescript здесь вообще ни при чем, так как он компилируется в Js.
    Во вторых, значение переменной is_favoutite нигде не перезаписывается по коду, а берётся в начале из некого «кэша». В третьих, вы совершаете асинхронную операцию - запрос к бэкэнду на изменение данных, но при этом не пытаетесь даже никак обработать результат этого запроса - колбэк добавить какой нибудь, в промис завернуть, async/await заиспользовать, что тоже промисы, но под капотом.
    При таких операциях ответ приходит не сразу же, а через какое то время, поэтому по классике в методы, которые совершают асинхронные операции, добавляют коллбэки - функции, которые могут принять результат и его обработать.
    Советую почитать про event loop, промисы, вообще про асинхронность в js. Ну или для начала хотя бы лучше узнать api инструмента, которым пользуетесь, а именно jquery и метод ajax, хотя бы.
    Ответ написан
    Комментировать
  • Как задекларировать модуль в TypeScript?

    ermolaevalexey
    @ermolaevalexey
    frontend веб-разработчик
    Можно в tsconfig.json прописать источник тайпингов. Удобнее будет создать в корне какую-нибудь директорию, например typings, и в нее класть все кастомные файлы *.d.ts. Однако,
    здесь проблема в том, что таким образом исчезнет поддержка других тайпингов из ` @types/* ` их нужно будет добавить в массив вручную.
    {
       "compilerOptions": {
           "typeRoots" : ["./node_modules/@types", "./typings"]
       }
    }

    https://www.typescriptlang.org/docs/handbook/tscon...
    Ответ написан
    Комментировать
  • Как вернуть итог отработки функции?

    ermolaevalexey
    @ermolaevalexey
    frontend веб-разработчик
    Mike Ro, чтобы увидеть результат, в вызов функции надо подставить аргументы. Вы ее вызываете с параметрами по умолчанию.
    Рекомендую к изучению:
    learn.javascript.ru/function-basics
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    В данном случае, вам необходимо передать функции два строковых аргумента: идентификатор DOM-элемента вашей формы и идентификатор DOM-элемента вашего инпута, как-то так:

    //подхватываем селектор класса (можно исп-ть id(#) если есть или самого элемента)
    // чтобы увидеть результат, можно обернуть вызов этой функции в console.log()
     required_checked_input1('.my_form', '.my_input')


    Обратите внимание, что вам надо использовать вариант функции, предложенный Сева.
    Ответ написан
    Комментировать
  • Пустая строка передается $_POST по умолчанию. Почему?

    ermolaevalexey
    @ermolaevalexey Автор вопроса
    frontend веб-разработчик
    function fetchFlats() {
    		global $link;
    		$where = '';
    		if(!empty($_POST['city'])){
    			if (count($_POST) > 1) {
    				$where .= 'rc.id_city = '.$_POST['city'].' ';
    			} else {
    				$where .= 'rc.id_city = '.$_POST['city'];
    			}
    		} else {//если пустой параметр то выкидываем
    			unset($_POST['city']);
    		}
    		if(!empty($_POST['metro']))  {
    			if (count($_POST) > 1) { //если параметров больше одного добавляем AND
    				$where .= 'AND rc.id_metro = '.$_POST['metro'].' ';
    			} else {//если один параметр
    				$where .= 'rc.id_metro = '.$_POST['metro'];
    			}
    		} else {
    			unset($_POST['metro']);
    		}	
    		if(  !empty($_POST['area_from']) ) {
    			if (count($_POST) > 1) {
    				$where .= 'AND f.total_area >= '.$_POST['area_from'].' ';
    			} else {
    				$where .= 'f.total_area >= '.$_POST['area_from'];
    			}
    		} else {
    			unset($_POST['area_from']);
    		}
    		if(  !empty($_POST['area_to']) ) {
    			if (count($_POST) > 1) {
    				$where .= 'AND f.total_area <= '.$_POST['area_to'].' ';
    			} else {
    				$where .= 'f.total_area <= '.$_POST['area_to'];
    			}
    		} else {
    			unset($_POST['area_to']);
    		}
    		if( !empty($_POST['price_from']) ) {
    			if (count($_POST) > 1) {
    				$where .= 'AND f.cost >= '.$_POST['price_from'].' ';
    			} else {
    				$where .= 'f.cost >= '.$_POST['price_from'];
    			}
    		} else {
    			unset($_POST['price_from']);
    		}
    		if( !empty($_POST['price_to']) ) {
    			if (count($_POST) > 1) {
    				$where .= 'AND f.cost <= '.$_POST['price_to'].' ';
    			} else {
    				$where .= 'f.cost <= '.$_POST['price_to'];
    			}
    		} else {
    			unset($_POST['price_to']);
    		}
    		$sql = "SELECT * 
    				FROM flat f
    				INNER JOIN building b ON f.id_building = b.id_building
    				INNER JOIN residential_complex rc ON b.id_residential_complex = rc.id_residential_complex WHERE ".$where;
    
    		if (!$result = mysqli_query($link,$sql)) {
    			echo $where;echo "<br/>";
    			var_dump($link);
    		} else {
    			$items = mysqli_fetch_all($result, MYSQLI_ASSOC);
    			mysqli_free_result($result);
    			return $items;
    		}
    	}


    Результат получается неожиданный:
    AND f.total_area >= 60  //распечатанный остаток строки запроса - переменная $where
    Ошибка синтаксиса MySql //(это ожидаемо, когда после WHERE идет сразу AND)
    //И самое главное - распечатанный пост:
    Array
    (
        [area_from] => 60
    )
    1 //кол-во параметров 1! Почему не выполняется вторая часть условия, и $where не идет      
       //без AND?

    Получается что один больше единицы, это бред какой-то или такой косячный код, но я уже не могу увидеть что именно не так, может быть Вы поможете еще разок?
    Ответ написан
  • Как прижать футер к низу страницы?

    ermolaevalexey
    @ermolaevalexey
    frontend веб-разработчик
    Думаю, что здесь может помочь установка минимальной высоты на область контента или на body. Но не в пикселях, а в процентах высоты видимой области, vh (vh - viewport height ). Примерно так:

    body {
       min-height: 100vh;
    }


    Высота видимой области будет рассчитываться автоматически, на весь экран, даже если контента будет одна строчка, и футер будет прижат всегда книзу.
    Ответ написан
    Комментировать