• Javascript срабатывает после 2 клика - почему?

    Что не так с $('#votepost').submit(function(e){ ?


    Верните false из функции и будет вам счастье
    Ответ написан
  • Как работает SPA при открытии дополнительных вкладок в браузере?

    SPA = Single page app. Другими словами - всё происходит на одной странице. Если вы открываете соседнюю вкладку, то да - нужно грузить все заново. Но по сути само приложение уже в кэше браузера и загрузить нужно только контент, который также может быть закеширован к этому моменту.

    Посмотрите в сторону изоморфных приложений, когда реакт рендерится как на сервере, так и на клиненте. Причем на клиент уже приходит HTML с данными.
    Ответ написан
    4 комментария
  • Как заставить React Router обновлять контент при переходе по аналогичным страницам с одним и тем же Handler с динамическим path?

    Какая версия реакта, роутера?

    Попробуйте использовать метод componentWillReceiveProps - он должен вызываться, когда меняются параметры роута (в вашем случае - ID).

    UPD1. Почему так происходит?
    Когда компонент получает новые свойства (props) - он перерисовывается. Проблема может быть если Вы, например, используете параметры вашего роута через state:
    class ControllerComponent extends Component {
    
        super() {
            super(props);
            this.state = { itemId: this.getParams().id };
        }
    
        //...
    
        render() {
            return (
                <div>
                    <p>Blah blah blah</p>
                    <SomeComponent itemId={this.state.itemId}/>
                </div>
            );
        }
    }


    При этом: когда меняется меняется id компонент ControllerComponent перерисовывается, но state не изменился, поэтому в SomeComponent попадет старый id и может показаться, что ничего не поменялось.

    class ControllerComponent extends Component {
    
        super() {
            super(props);
            this.state = { itemId: this.getParams().id };
        }
    
        componentWillReceiveProps(nextProps) {
            this.setState({ itemId: this.getParams().id });
        }
    
        //...
    
        render() {
            return (
                <div>
                    <p>Blah blah blah</p>
                    <SomeComponent itemId={this.state.itemId}/>
                </div>
            );
        }
    }


    Тогда все будет ок. Кстати, согласно докам componentWillReceiveProps:

    Calling this.setState() within this function will not trigger an additional render.

    Значит мы лишний раз не будем рендерить наш компонент. Успех)
    Ответ написан
    3 комментария
  • Валидация Get запросов Angular + Laravel?

    Попробуйте добавить резолв в роут:
    resolve: {
        validation: function ($q, $routeParams) {
            var deferred = $q.defer(),
                id = parseInt($routeParams.id, 10);
    
            if (!isNaN(id)) {
                deferred.resolve();
            } else {
                deferred.reject('VALIDATION FAILED');
                $location.path('/login');
            }
    
            return deferred.promise;
        }
    }
    Ответ написан
    Комментировать
  • Насколько широко сейчас можно применять рендер на клиенте?

    Если вы пишете на ангуляре, то рендерить что-либо на сервере в большинстве случаев не имеет смысла.

    Что касается сео - я сам интересовался некоторое время назад, посмотрите тут: Индексация сайта при использовании AngularJS

    Так что сейчас нету особых проблем с сео таких приложений.
    Ответ написан
    Комментировать
  • Какие есть способы перемещения по элементам в json структуре?

    Подобие дерева. Перемещаться можно рекурсивно:
    function doSomethingWithNode(node) { 
        console.log(node);
    }
    
    function processNode(node) { 
        doSomethingWithNode(node);
        node.children.map(processNode);
    }
    
    menu.map(processNode);
    Ответ написан
    Комментировать
  • Как в AngularJS ui-router сделать вложенные стейты?

    Скорей всего у Вас ошибка в шаблоне для core.api . В документации к uiRouter сказано, что:
    //Relatively targets the unnamed view in this state's parent state <div ui-view/>
    "" : { ... }


    То есть вьюха с пустым названием загружается во вьюху без названия родителя. А если у Вас в шаблоне родителя нету такой вьюхи (а, судя по Вашему описанию - ее нету), то она никуда и не грузится.

    Может быть вам подойдет такой вариант для core.api.create:
    // absolutely targets the unnamed view in root unnamed state.
    // <div ui-view/> 
    "@" : { ... }


    Либо добавьте <div ui-view/> в шаблон core.api
    И если Вы используете только unnamed views, то можно проще делать - указывать templateUrl как у Вас в core state
    Ответ написан
    1 комментарий
  • Как распарсить url и присвоить .path иное значение с помощью angular js?

    Так и чем $localion.path() не устраивает?
    Ответ написан
    Комментировать
  • Что лучше использовать для реализации автоподсказок в AngularJS?

    Директива в этом случае сделает код реюзабельным - Вы сможете сделать вторую форму и использовать на ней этот же код. Другими словами - использование директивы полностью оправдано.

    А насчет:
    сервиса (в котором будут храниться актуальные значения инпутов)

    Не знаю, насколько это красиво будет. Можно например сделать изолированный скоуп для директивы и передавать туда массив с
    автоподсказками, которые будут формироваться из предустановленных значений + тех, которые уже введет в форму
    Ответ написан
    3 комментария
  • Обязательно ли необходим javascript для того, чтобы работать с angularjs?

    Просто как я понимаю из позиционирования jquery и angularjs - библиотека, упрощенный javascript, а второе - фреймворк, написанный на javascript'е, так?


    jQuery - библиотека, облегчающая работу с DOM
    Angular - фреймворк для построения single page application (spa)

    Ни то ни другое никак не "упрощает" javascript. Так что js Вам выучить придется.
    Ответ написан
    Комментировать
  • Datepicker Angular ui?

    Может ошибки какие-нибудь в консоли? Другая версия библиотек?

    И у вас у инпута стоит атрибут value="today" - если есть ng-model, то это не нужно. Вы просто устанавливаете в значение инпута строку "today".
    Ответ написан
  • Angularjs && ui-router - как реализовать переход между parentPage и childPage без перезагрузки?

    Не совсем понятно. У Вас получается одна вьюха
    <div ui-view="page"></div>
    На все роуты. Т.е. при переходе на любую из страниц эта вьюха полностью обновляется
    Ответ написан
  • Пример работы с директивами?

    Вот, например есть селект и директива, меняющая текст в зависимости от значения селекта (рабочий пример):

    app.js
    angular.module('myApp',[]);
    
    angular.module('myApp')
        .controller('myCtrl',[ '$scope',
            function($scope){
              $scope.options = [
                {name:'text1'},
                {name:'text2'}
              ];
              $scope.selectedText = $scope.options[0];
            }
        ])
        .directive('myDirective', [ function () {
            return {
                    restrict: 'AE',
                    scope: {
                        selectedValue: '=ngModel',
                    },
                    templateUrl: 'directive-template.html',
                    link: function(scope,elem,attrs) {
                    
                    },
                    controller: function($scope) {
                      $scope.isChosen = function(v) {
                        return $scope.selectedValue == v;
                      };
                    }
                };
        }])
    ;

    index.html
    <body ng-controller="myCtrl">
        <p>Hello world!</p>
        <select ng-model="selectedText" ng-options="opt.name for opt in options"></select>
        <div ng-model="selectedText.name" my-directive=""></div>
      </body>

    directive-template.html
    <div>
      <h1 ng-show="isChosen('text1')"> ТЕКСТ 1 </h1>
      <h1 ng-show="isChosen('text2')"> ТЕКСТ 2 </h1>
    </div>
    Ответ написан
  • Как сделать код рабочим для promise Angular?

    В вашем случае достаточно просто проверить промис на резолвед:
    $scope.getLen = function() {
        if(!$scope.insurances.$resolved)
            return 0;
        return $scope.insurances.length;
    }


    В остальных случаях используйте promise.then
    Ответ написан
    Комментировать
  • Как при помощи angular можно изменить валюту сайта?

    Используйте фильтры.
    <span>{{price | myCurrencyFilter}}</span>
    Ответ написан
    Комментировать
  • Как такое переписать на angular?

    Как сделать на angular так, чтобы при нажатии "заказать" парсились данные товара

    У вас уже есть все данные в disks. Зачем их парсить?

    1. Используйте ngClass,ngSrc:
    Вместо:
    <div ng-repeat="disk in disks | filter:search" class="product-block {{disk.Genre}}">
    <img id="{{disk.ID}}_img" src="img/{{disk.Image}}" alt="">


    2. Уберите все эти ID. Это не angular way.

    3. Если Вам нужна кнопка - используйте кнопку, а не ссылку:
    Вместо:
    <a href="" id="{{disk.ID}}">Заказать</a>
    Надо:
    <button type="button">Заказать</button>

    4. Используйте ngClick директиву:
    <button type="button" ng-click="order(disk)">Заказать</button>


    5. Для использования localstorage я рекомендую использовать специальный сервис (можно взять этот).

    6. Сохранение
    В контроллере:
    // Где-то внутри Вашего контроллера
    // $scope.orderList - список заказов
    $scope.order =  function(disk) {
        // Добавляем заказ. Будет выглядеть примерно так:
        $scope.orderList.push(disk);
    }


    7.
    Товары, добавленные в корзину, храню в localstorage, так вот: как его очистить, чтобы данные на странице обновились без перезагрузки страницы?

    $scope.clearAllOrders = function() {
        $scope.orderList.length = 0;
    }


    8. При удалении аналогично - используйте Ваш контроллер и ngClick:
    <button type="button" ng-click="del(disk)">Отменить заказ</button>

    В контроллере:
    // Где-то внутри Вашего контроллера
    $scope.del=  function(disk) {
        // Удаляем заказ. Будет выглядеть примерно так:
        // Получаем индекс диска в массиве $scope.orderList
        // Будьте внимательные - поиск идет по ссылке, а не по значению
        var diskIndex = $scope.orderList.indexOf(disk) ;
        $scope.orderList.splice(diskIndex,1);
    }


    9.
    То есть удаляется конкретный объект из массива и localstorage сохраняется с новыми данными.
    reloader() - функция перезагрузки страницы.
    Так вот, интересует как это можно реализовать без перезагрузки страницы.

    Нормально через сервисы организуйте структуру данных и сделайте биндинги - все остальное за вас сделает ангуляр.
    Вам подойдет watch:
    // $scope.orderList - массив заказов
    $scope.$watch('orderList',function(nv,ov){
       localStorageService.set('ключ',angular.toJson(nv));
    });


    Получается связь scope.orderList -> localStorage и все синхронизировано

    UPD2.
    Я изменил ответ - убрал лишний мусор, теперь все ок.
    Ответ написан
  • Как сделать поле обязательным?

    В дополнении ответа Сергей Протько :
    https://docs.angularjs.org/api/ng/directive/ngDisabled

    UPD1:
    Пример использования (2 обязательных поля, 1 - нет) jsfiddle:
    <form name="myForm" ng-submit="yourSubmitFun()">
        <input type="text" ng-model="yourModel1" required />
        <input type="text" ng-model="yourModel2" required />
        <input type="text" ng-model="yourModel3" />
        <button type="submit" ng-disabled="myForm.$invalid"> Submit form </button>
    </form>
    Ответ написан
  • Как прижать футер вниз и чтобы его высота менялась при добавлении контента?

    Никакого JS. Смотрите пример c bottom:0. Работает с любым количеством контента.

    Вот еще один способ (тут надо жестко задавать высоту футера)
    Ответ написан
  • Как скрыть/показать блок в зависимости от выбранного элемента списка?

    Добавьте ngModel к селекту:
    <select id="autoAppl" class="form-control auto_applications" ng-model="autoApplications">
        <option class="auto" value="Y">Да</option>
        <option class="auto" value="N" selected>Нет</option>
    </select>


    И для добавьте ngShow:
    <div class="new_service applications" ng-show="autoApplications == 'Y'">
    Ответ написан
    Комментировать
  • Клон исчезает, а исходный div остается, как сделать наоборот?

    Вы и сами почти решили задачу :)

    Адекватный вариант (jsfiddle):
    $(function() {      
        $(".group").draggable({
                    containment: 'document',
                    zIndex: 9999,
                    helper: 'clone',
                    appendTo: '.anotherDiv'
        }).on("drag",function(e){
            // Когда начинаем перемещать - удаляем оригинал
            $(this).remove();
        });
    });


    Еще есть неадекватный вариант (jsfiddle) если хотите вручную все это проделывать (или показывать другой элемент и т.д.):
    $(function() {
        // При нажатии кнопки мышки на элементе
        $(".group").mousedown(function(e){
            var $this = $(this);        
            // Клонируем оригинал
            var clonedNode = $this.clone(); 
            // Устанавливаем координаты и абсолютное позиционирование относительно body
            // Чтобы вставить новый блок в то же место где был оригинал
            clonedNode.css($this.offset());         
            clonedNode.css({position:'absolute'}); 
            // Делаем элемент перетаскиваемым
            clonedNode.draggable({
                    containment: 'document',
                    zIndex: 9999,
                    appendTo: '.anotherDiv'
            });
            // Добавляем клон на страницу (в body), а оригинал - удаляем
            $('body').append(clonedNode); 
            $this.remove();
            // Говорим клону, что на него пользователь нажал мышкой (начал перетаскивать)
            clonedNode.trigger(e);
        });
    });


    UPD1:
    Если Вам нужно, чтобы блок добавлялся в контейнер в который вы его бросаете - настройте droppable. Я покопался - написал более полный пример (jsfiddle)
    $(function() {    
        // Для всех элементов инициализируем draggable
        $(".group").map(initDraggable);
        // Инициализируем droppable
        $(".anotherDiv").droppable({
            accept:  '.group',
            drop:  function(event, ui) {
                // Если мы успешно бросаем элемент - клонируем его
                // Не забудем удалить класс hiddenGroup - т.к. оригинал перетаскиваемого элемента был спрятан
                $(this).append($(ui.draggable).clone().removeClass('hiddenGroup'));
                // Удалим оригинал
                $(ui.draggable).remove();
            }
        });    
        
        function initDraggable(){        
            // Сохраняем элемент
            var $el = $(this);        
            $el.draggable({
                    containment: 'document',
                    zIndex: 9999,
                    helper: 'clone',
                    appendTo: '.anotherDiv',
                    revert: function(isValidDrop){
                        // Эта функция вызывается, когда элемент закончили перетаскивать
                        // Параметр isValidDrop - истина, если элемент успешно перетащен (его бросили в контейнер anotherDiv)
                        if(!isValidDrop){                                   
                            // Если же элемент был брошен не там, то сделаем оригинал снова видимым 
                            // (клон пропадет, если мы вернем false см. ниже)
                            $el.removeClass('hiddenGroup');                        
                        }
                        // По-хорошему надо возвращать !isValidDrop, но тогда при отмене перетаскивания
                        // будет анимация (блок полетит обратно на свое место) 
                        // и одновременно с этим будет показан оригинал (из условия выше) - выглядит некрасиво
                        return false;//!isValidDrop;
                    }
            }).on("drag",function(e){
                // При начале перетаскивания - прячем оригинальный блок
                $el.addClass('hiddenGroup');
            });
        }
    });


    UPD2:
    Последний вариант, все как Вы просили (надеюсь) (jsfiddle):
    $(function() {      
        $(".group").map(initDraggable);
        $(".anotherDiv").droppable({
            accept:  '.group',
            drop:  function(event, ui) {
                // Добавим position: absolute           
                // И клонируем наш хэлпер, а не оригинал
                var $cloned = $(ui.helper).clone().addClass('droppedGroup'); 
                
                $(this).append($cloned);     
                initDraggable.apply($cloned);
                $(ui.draggable).remove();
            }
        });    
        
        function initDraggable(){        
            var $el = $(this);
            
            $el.draggable({
                containment: 'document',
                zIndex: 9999,
                helper: 'clone',
                appendTo: '.anotherDiv',
                start:  function(event, ui){ 
                    $el.addClass('hiddenGroup');
                },
                revert: function(isValidDrop){
                    if(!isValidDrop){                  
                        $el.removeClass('hiddenGroup');                        
                    }
                    return false;//!isValidDrop;
                }
            });
        }
    });
    Ответ написан