• Как добится мультиязычной маршрутизации в angularjs?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Изящного решения не предложу и на вопрос не отвечу, но оставлю здесь свой комментарий, для истории :)

    Хочу отговорить вас делать такую маршрутизацию — совершенно не обязательно загрязнять УРЛ данными о языке (особенно писать /en, когда у вас домен .com — это же и так обычно английский; или писать /ru при домене на .ru — там же и так русский обычно). Посмотрите на любой многоязычный сайт — там нет языка в адресной строке ни в каком виде, это уже прошлый век. (Исключение состовляют только огромедные сайты, где не только язык интерфейса разделен, но и сам контент и даже поиск по нему — например, Википедия).

    При заходе пользователя на сайт, берете язык из куков или определяете его язык (это делается средствами браузера — navigator.language и иже с ним) и сохраняете полученный язык в куках. Загружаете файл-локализации. Всё. Если пользователь нажал на другой язык, то сохраняете его в куках и подгружаете другой файл локализации.

    При последующих заходах язык уже будет известен, а подгрузку файла локализации можно ускорить, храня его в localStorage.

    Так же запаритесь каждый раз при вызове, например, $location.path(...), передавать туда еще и текущий язык. И сам конфиг роутов у вас будет выглядеть неизящно:

    $routeProvider
            .when('/:lang/about',
                {
                    templateUrl: 'pages/about.html',
                    controller: 'AboutController'
                })

    и так каждый роут.

    Ну и еще, а если пользователь ручками наберет адрес раздела в адресной строке и забудет язык указать (наберет просто mysite.com/about, а не mysite.com/ru/about), то что, приложение не будет работать?

    А для локализации используйте Angular Translate.
    Ответ написан
    4 комментария
  • В чём различия setTimeout и $timeout?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Самое главное это то, что $timeout обновляет скоуп (всякие данные на страничке изменятся), а простой setTimeout ничего не обновит в скоупе (данные на страничке как были так и будут старые).

    Еще самое главное — $timeout ни в коем случае не является заменой setTimeout!!!

    Если у вас функционал, который работает с данными скоупа и биндит переменные, то используйте $timeout, если же вам просто нужно что-то исполнять по таймауту (например, раз в секунду что-то делать, потом, через секунду, опять, и так далее, но не связанное с обновлением данных скоупа), то используйте setTimeout. Тобишь, $timeout запускает $digest-цикл и перерисовывает страничку — вот и представьте, если вы каждую секунду будете перерисовывать страничку.
    Ответ написан
    Комментировать
  • Как использовать в angular localstorage?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    AngularJS и LocalStorage API никак не связаны, вообще-привообще не связаны, это абсолютно разные вещи. LocalStorage это API браузера, вызовы методов которого доступны на языке программирования. AngularJS это Яваскрипт-фреймворк. Язык программирования называется не Angular, а Javascript. Поэтому, чтобы использовать LocalStorage, нужно просто брать и использовать, это обычный Яваскрипт, к Ангулару это не имеет совершенно никакого отношения.
    Ответ написан
    5 комментариев
  • Актуален ли сейчас jQuery?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Как только вы будете использовать Ангулар (или подобный фреймворк), то жиКвери вам вообще не будет нужен совсем (как, совсем? да, совсем-присовсем), ни для слайдеров, ни для любых других интерактивных штук, ни для работы с DOM, ни для чего вообще.

    Актуален жиКвери для совсем уж простеньких корпоративных говносайтов или лендинг-пейджей, которые нужно сделать как можно скорее, так сказать, на от****сь, где нужно быстренько тупо прикрутить какие-нибудь готовые жиКвери-плагинчики и сдать тупому заказчику. А так, как таких сайтов тьма и они будут всегда, то и актуальность жиКвери будет поддерживаться еще дооолгое время, это инфа 100%.
    Ответ написан
    1 комментарий
  • Какие вы видите перспективы в развитии js "оберток"?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Обертки (в частности Кофескрипт) превращают ваш красивый Яваскрипт-код в монструозное Perl-подобное отвратительное говно, отвратительный синтаксис. Кому-то нравится...
    Ответ написан
    3 комментария
  • Возможно ли сделать квадратный блок авто ширины средствами HTML+CSS?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Гуглите выражение css padding hack, тема стара как мир — это как раз то, как сделать высоту блока пропорциональной ширине блока. Вот песочница, меняйте ширину фрейма, квадратик будет пропорционально менять свои размеры.
    Ответ написан
    1 комментарий
  • Блок с текстом при резиновой верстке. Как задать высоту для ограничения текста?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Гуглите выражение css padding hack — это как раз то, как сделать высоту блока пропорциональной ширине блока. Вот песочница, я сделал блок с текстом в 2 раза меньше, чем его ширина. Еще для красоты нужно сделать внизу блока градиентную от белого к прозрачному подложку, чтобы текст, который не влезает в блок, красиво пропадал. Ну и еще нужно будет играться с max-width или max-height, иначе проценты всегда будут растягивать блок по высоте.
    Ответ написан
  • AngularJS, как при пагинации возвращаться наверх странницы?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    В самом главном контроллере слушайте изменения УРЛ страницы и крутите наверх:
    $rootScope.$on('$routeChangeSuccess', function(e, current, previous) {
        window.scrollTo(0, 0);
    });


    UPD:
    Если вы хотите сделать пагинацию на сайте вида mysite.ru/1, то в роутах у вас должно быть примерно следующее:
    $routeProvider
         .when('/:pageNumber?', {
              templateUrl: 'partials/home.html',
              controller: 'HomeCtrl'
         })


    В контроллере присоединяйте $routeParams, чтобы считывать переменные из роута, а так же присоединяйте paginationService, у него есть метод setCurrentPage, который задает текущую страницу:
    watchesStore.controller('WatchesStoreController', function($routeParams, paginationService) {
        var pageNumber = $routeParams.pageNumber || 1;
            pageNumber = parseInt(page, 10);
    
        var paginationId = 'watchesStore'; // setCurrentPage требует instanceId — айдишку экземпляра пагинатора, чтобы знать, какой блок, собственно, пагинировать
    
        paginationService.setCurrentPage(paginationId, pageNumber);
    });


    А в HTML-коде у вас нужно еще айдишку экземпляра пагинации (мы его назвали watchesStore) вставить в директиву:
    <dir-pagination-controls boundary-links="true" on-page-change="pageChangeHandler(newPageNumber)" template-url="dirPagination.tpl.html" pagination-id="watchesStore"></dir-pagination-controls>


    UPD2:
    А, только что заметил, что у вас уже есть роут для айдишки часов:
    $routeProvider
        .when('/:watchId', {
            templateUrl: 'partials/watch-detail.html',
            controller: 'WatchDetailCtrl'
        })


    Значит, для пагинации используйте не mysite.ru/1, а обычные GET-параметры mysite.ru/?page=1. В результате в контроллере страничку будете получать так:
    watchesStore.controller('WatchesStoreController', function($location, paginationService) {
        var params = $location.search();
    
        var pageNumber = params.page || 1;
            pageNumber = parseInt(page, 10);
    
        ...
    });
    Ответ написан
    3 комментария
  • Если ты турист, то можно ли устроиться на работу в Европе?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Странное место вы выбрали для таких вопросов — гораздо же надежнее просто сходить в местное отделение МИД той страны, где вы сейчас находитесь и... спросить там :)
    Ответ написан
    Комментировать
  • Какой существует плагин для создания эффекта перетаскивания страниц мышкой?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Как только люди видят прикольненький эффектик, так тут же ищут жиКвери-плагин и хотят поставить себе на сайт :) Это не жиКвери-плагин, это кастомный сложный скрипт. Самое близкое по функционалу, это слайдер, где можно мышкой перелистывать слайды.
    Ответ написан
    Комментировать
  • Как лучше организовать динамическое обновление блоков HTML на JS?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Только лишь для одного виджета корзины Ангулар подключать конечно же не стоит :)

    На Ангуларе это делается следующим образом — есть директива корзины (виджет) и есть сервис корзины. Добавление товаров в корзину идет через сервис, а директива слушает изменения сервиса и выводит у себя обновленную инфу.

    Вот Директива:
    angular.module('app').directive('shoppingCartWidget', function(shoppingCartService) {
        return {
            restrict: 'E',
            replace: true,
            scope: {},
            templateUrl: 'shopping-cart.html',
            link: function(scope, element, attributes) {
                scope.items = [];
    
                // слушаем изменения в корзине
                scope.$watch(shoppingCartService.getItems, function(items) {
                    scope.items = items;
                });
            }
        }
    });


    Вот сервис:
    angular.module('app').directive('shoppingCartService', function(_) {
        var items = [];
    
        function add(itemData) {
            items.push(itemData);
        }
    
        function remove(itemID) {
            items = _.reject(items, {id: itemID});
        }
    
        function clear() {
            items = [];
        }
    
        function getItems() {
            return items;
        }
    
        return {
            add: add,
            remove: remove,
            clear: clear,
            getItems: getItems
        }
    });


    Вот контроллер:
    angular.module('app').controller('myController', function(shoppingCartService) {
    
        // ну, тут будет не массив, а $resource, например
    
        $scope.items = [
            {
                id: 1,
                name: 'Клавиатура',
                price: 150
            },
            {
                id: 2,
                name: 'Кофе',
                price: 50
            }
        ];
    
        $scope.addToCart = addToCart;
    
        function addToCart(itemData) {
            shoppingCartService.add(itemData);
        }
    
    });


    Вот вьюха списка товаров:
    <ul>
        <li ng-repeat="item in items">
            <span>{{item.name}}</span>
            <button ng-click="addToCart(item)">Добавить в корзину</button>
        </li>
    </ul>
    Ответ написан
    5 комментариев
  • Как в AngularJS проскролить окно до первого невалидного инпута?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Скроллить браузер не нужно — достаточно просто поставить .focus() на элемент, браузер сам прокрутит куда надо. (Извиняюсь, не заметил, что вопрос был задан год назад :)
    Ответ написан
    Комментировать