Ответы пользователя по тегу JavaScript
  • Создание сервера с базой данных. С чего начать?

    Есть классика - LAMP стек: Apache + PHP + MySQL. Как уже писали выше, если хотите на JS - MEAN стек: Angular + Node +MongoDB.
    Если хотите на Java: смотрите в сторону Spring MVC.
    Ответ написан
    Комментировать
  • Шаблонизатор twig на js?

    На JavaScript'е есть много других шаблонизаторов и даже фреймворков для организации архитектуры
    Ответ написан
  • Здача по JS (замыкания)?

    Первый вариант, однозначно - правильный. Только я бы сделал не IIFE, а через промежуточную функцию:
    var getAdder = function () { var res = 0; return function(x) { res += x; return res; } };
    var sum = getAdder();
    sum(1); // 1
    sum(3); // 4
    var sum2 = getAdder(); // два независимых сумматора
    sum2(1); //1
    sum2(3); // 4


    А насчет второго варианта: зачем использовать такой синтаксис ? Крайне неудобно на мой взгляд.
    А главное, вы замыкаете функцию на внешнюю переменную - это не очень хорошо. Поясню:
    var adder2 = new Function('x', 'var result = adder.last? adder.last + x : x; adder.last = result;  return result');
    adder2(2); //ReferenceError: adder is not defined

    Поэтому, от второго решения я бы отказался.
    Ответ написан
    8 комментариев
  • Почему происходит магия в JS коде?

    Я не знаток CoffeeScript, но судя по всему, ваш скрипт генерирует вот такой JS код (ссылка на jsfiddle):
    var a = [ { id: 0 }, { id: 1 }, { id: 2 } ];
    for(var i = 0; i != a.length; ++i)
    {
        var el = a[i];
        setTimeout(function() { 
            console.log('timeout',el);
        },100);
    }


    В этом случае вы замыкаете вашу анонимную функцию на переменную el, значение которой меняется на каждой итерации. Таким образом после окончания цикла значение el будет равно последнему элементу массива. А так как анонимная функция будет вызвана после завершения цикла, то это приведет к результату, который вы описали:
    timeout Object { id: 2 }
    timeout Object { id: 2 }
    timeout Object { id: 2 }


    Для того, чтобы ваш код выполнялся правильно - можно сделать такой трюк: передавать el в качестве аргумента в некую функцию, которая возвратит нам коллбэк функцию (пример на jsfiddle):
    var a = [ { id: 0 }, { id: 1 }, { id: 2 } ];
    var createCB = function(e){
        return function() { 
            console.log('timeout',e);
        };
    };
    for(var i = 0; i != a.length; ++i)
    {
        var el = a[i];
        setTimeout(createCB(el),100);        
    }


    В этом случае при создании коллбэка у нас в области видимости будет всегда текущее значение el:
    timeout Object { id: 0 }
    timeout Object { id: 1 }
    timeout Object { id: 2 }
    Ответ написан
    1 комментарий
  • Angular. Как добавить scope у директивы и при этом иметь доступ к переменной из scope контроллера?

    Присмотритесь к
    scope.$parent
    В случае, если директива находится сразу внутри контроллера scope.$parent будет указывать на scope контроллера.

    Хотя я не считаю это хорошим решением. Если директива будет просто так обращаться в другой scope, то, возможно, Вам нужно пересмотреть архитектуру ...
    Ответ написан
  • Как получить значение inpu с блоков с одинаковым классом?

    Я так понимаю, что у вас вот так выглядит иерархия DOM:
    div.food_box_scroll_item > div.btn_food_box_scroll > a.but_call_min

    Тогда вам надо немного подправить ваш JS:
    $('.but_call_min').click(function(){
        console.log('Selected:',$(this).closest('.food_box_scroll_item').find(".value_number_of_servings").val());
    });

    Этот код выводит в консоль значение с input.

    А вот так будет выглядеть Ваш код:
    /*Add to cart*/
    $(document).ready(function() {
    	$(".food_box_scroll_item .btn_food_box_scroll .but_call_min").click(function(){
    		prod_id = $(this).attr("rel");
    		count_this = parseInt($(this).closest('.food_box_scroll_item').find(".value_number_of_servings").val());		
    		// addToCart(prod_id, count_this);
                    // alert(count_this); // - так плохо
                    console.log(count_this); // - так хорошо
    	});
    });
    Ответ написан
  • Почему не работает cross-domain HTTP OPTIONS запросы?

    iNikNik
    @iNikNik Автор вопроса
    Прошла неделя. Я не сдался :)

    После различных экспериментов - мне стало понятно, что проблема где-то в конфигурации апача. Так как OPTIONS-запросы не доходят до моего htaccess. Но, поскольку, я ни разу в жизни не работал с этим конфигом - я не знал что искать и что исправлять.

    Но однажды я наткнулся на пост на stackoverflow с заголовком - "Как настроить апач, чтобы он блокировал OPTIONS-запросы". Эврика! Это было то, что нужно! И я без труда нашел в своем конфиге OpenServera следующие строки:
    <Directory "%ssitedir%/*">
        AllowOverride All
        Options -MultiViews +Indexes +FollowSymLinks +IncludesNoExec +Includes +ExecCGI
        <LimitExcept GET POST HEAD >
            Require all denied
        </LimitExcept>
    </Directory>

    И добавил OPTIONS запрос:
    <Directory "%ssitedir%/*">
        AllowOverride All
        Options -MultiViews +Indexes +FollowSymLinks +IncludesNoExec +Includes +ExecCGI
        <LimitExcept GET POST HEAD OPTIONS DELETE>
            Require all denied
        </LimitExcept>
    </Directory>


    Все заработало! Ура, товарищи!!
    Ответ написан
    3 комментария
  • Как задержать построение документа или обработку директивы до получения данных с сервера?

    Я использовал $broadcast для такой задачи. В вашем случае - добавить в контроллер отправку сообщения 'dataloaded':
    Order.query({id: 'all'}, function(orders) {
            $scope.orders = orders;
            console.log('get data from server');
            $scope.$broadcast('dataloaded');
          });


    А в директиве сделать инициализацию при наступлении события dataloaded:
    .directive('orderDrct', ['$compile',
        function ($compile) {
          return {
            restrict: 'A',
            link: function (scope, element) {
              scope.$on('dataloaded', function ()
              {
                  // Ваш код
                  console.log('end of directive');
              });          
            }
          };
        }
      ]);


    В этом случае ваш код выполниться после того как придет событие dataloaded.
    Ответ написан