Ответы пользователя по тегу JavaScript
  • В чем моя причина провала тестового задания Яндекса?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Жесть. Посмотрел гифку на Гитхабе, там, где весь процесс наглядно показан, код даже не смотрел.

    Ну вот смотрите, ясно же, что информация о маршрутах, вот все эти текстики, типа, «Из Стокгольма на пароме до Риги, каюта 6a…», это всё должно генерироваться из данных, а не ручками в textarea писать :)

    Вам нужно было образно придумать, что за АПИ вы будете использовать и какие данные от него приходят — из этих данных создавать все записи и весь путь.

    Из {откуда} на {транспорт} до {докуда}, {тип_места: каюта, сиденье, место и т.п. в зависимости от типа транспорта} {номер_места} и прочие данные… — и еще для всего этого нужна локализация (не только же на русском тексты будут), и еще всё это нужно просклонять, если уж вообще перфекционистски делать — согласитесь, «Из Стокгольм до Рига…» звучит ужасно.

    А у вас просто всё это пишется в текстовом поле — тогда уж вообще нужно одно текстовое поле вместо всей вашей формы и кнопочек, и там оператор напишет кучу текста сам, с кучей ошибок, несистемно :)

    Вот сейчас возьмите всё, что вы сделали, и представьте, что номер рейса изменился, или номер сиденья изменился (вас поменяли с кем-то, и у вас изменилось место и у другого человека) — как вы это обрабатывать будете? Заходить в каждый маршрут и ручками править текст в textarea?

    А насчет данных и сортировки, элементарно — данные самые обычные, обычный жисончик, массив из объектов. Сортировка по левому и правому ключу, nested sets, чтобы можно было создавать маршруты любой глубины, например, не просто Рига → Стокгольм, а между ними маршруты по Риге и маршруты по Стокгольму... ну, как дерево, можно раскрыть один маршрут, а там подмаршруты.
    Ответ написан
    1 комментарий
  • А расскажeте про promise и $resource?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Первое — чтобы преобразовать ангуларовский объект (в котором есть всякие одно- и двудолларовые параметры, все эти $xxx и $$xxx) в нормальный (т.н. raw json) нужно использовать стандартные ангуларовские методы из коробки:
    angular.fromJson(response)
    и
    angular.toJson(response)

    Просто поковыряйте эти функции и посмотрите, что они вернут.

    По поводу промисов. Когда вы вызываете какой-либо $resource-метод, например, .query(), то вам сразу же, моментально, возвращается объект с двумя параметрами — $promise и $resolved: false. После того, как ресурс получил данные, в ваш объект с двумя параметрами добавляется ещё куча данных (ну, json-данные, что вам вернул сервер), а параметр $resolved становится true.

    Так вот $promise нужен тогда, когда после загрузки данных вам нужно что-то сделать :) Ведь когда вы послали запрос, вы не знаете, когда придет ответ, а $promise знает и позволяет вам что-нибудь сделать именно после загрузки. Обращаться к промису нужно так:
    vm.data = dataService.getData().$promise.then(success, error);
    
    function success(resource) {
        // тут не данные в resource, а объект $resource с данными, тут можно почистить его через angular.fromJson и т.п.
    }

    Тут, после получения данных, ваш vm.data сразу же пополняется данными ответа (и вы там что-то выводите через ng-repeat — Ангулар там сам понимает, что выводить нужно только ваши данные, и не выводит еще два параметра $promise и $resolved, хотя они в объекте присутствуют, как вы уже в console.log вывели и убедились), а в функции success можно еще что-нибудь сделать.

    Можно так же сразу и не присваивать vm.data ничего, а сначала сделать какие-то действия в success и только потом присвоить, вот так:
    dataService.getData().$promise.then(success, error);
    
    function success(resource) {
        // тут не данные в resource, а объект $resource с данными, тут можно почистить его через angular.fromJson и т.п.
        // сначала что-нибудь делаем с полученными данными, а потом присваиваем их в скоуп
        vm.data = transformMyData(resource);
    }
    Ответ написан
    4 комментария
  • Покритикуйте верстку, какие в ней есть ошибки?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    «пока вручную, без бутстрапа» — с чего вы взяли, что адаптивная верстка, да и верстка вообще, делается обязательно с Бутстрапом? Это совершенно ненужный цсс-фреймворк, который почему-то все пихают везде.
    Ответ написан
    1 комментарий
  • Зачем нужны комментарии после тега script?

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

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    reloadOnSearch: false (документация)
    Ответ написан
    Комментировать
  • Какое событие происходит при замолкании HTML5 audio плеера при плохом интернете????

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Что, реально, Максим Доши?

    Вот эвенты:

    var events = [
        'emptied',
        'loadedmetadata',
        'loadeddata',
        'canplay',
        'canplaythrough',
        'playing',
        'ended',
        'waiting',
        'ended',
        'durationchange',
        'timeupdate',
        'play',
        'pause',
        'ratechange',
        'volumechange'
    ];


    Вешаете их на плеер:

    _.each(events, function(type) {
        player.addEventListener(type, onEvent, false);
    });
    
    function onEvent(e) {
        console.log(e.type);
    }


    А потом имитируете плохое подключение (погуглите) и смотрите, какие события вызываются.
    Ответ написан
  • Как в kendo grid передать данные со скоупа?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    С — Скойп :)
    Ответ написан
    Комментировать
  • Как сделать плавный scroll?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Тобишь, вам ни интеллект, ни элементарнейшая сообразительность, ни религия не позволяет погуглить, что такое originalEvent и wheelDelta, а так же просто поискать по словам «плавный скролл» прямо на этом сайте, в строке поиска, она наверху такая, вот в ней можно искать — вопросы про плавный скролл задают каждую неделю.
    Ответ написан
    1 комментарий
  • Где найти пример подбных «карточек»?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Как же бесят сайты с автоподгрузкой при прокручивании. Умники, создатели/дизайнеры сайта, вы хоть раз пробовали своим произведением пользоваться? — попробуйте прокрутить до футера, чурбаны.
    Ответ написан
    2 комментария
  • Grunt и проблема с файлами (тысячи их). Что делать?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Использую Грунт для N проектов, но папка node_modules у меня одна (там пара дестяков тысяч файлов), она лежит просто на диске Д, а все проекты просто ссылаются на эту папку (делаю junction утилиткой HardLinkShellExt — она создает ссылки на папки).

    Тобишь, на диске Д есть папка node_modules с кучей модулей и десятками тысячами файлов, и в каждом проекте есть папка с названием node_modules, но она пустая и вообще не папка, а ссылка на ту главную папку.

    Единственное, у меня все Грунт-модули всегда одинаковых версий в конфиге package.json — нет такого, что в одном проекте мне нужен некий Грунт-модуль одной версии, а в другом проекте этот же модуль мне нужен другой версии.
    Ответ написан
    1 комментарий
  • Как работает Require.JS?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Если вы используете AngularJS, то RequrieJS вам не нужен вообще никогда.

    1) Если вы делаете жирного клиента (т.е. все скрипты минифицируете в один-два файла, например: components.js (в котором AngularJS, LoDash.js и прочие библиотеки/плагины), application.js (собственно, ваша аппликация: контроллеры, директивы и прочее) и templates.js (все ХТМЛ-шаблоны для директив и страничек)), то вам RequireJS не нужен вообще — он просто бесполезен, так как асинхронно подгружать модули вам больше не нужно, ведь у вас и так всё есть, а Dependency Injection уже есть в Ангуларе из коробки.

    2) Если же вы используете Ангулар и для Dependency Injection хотите использовать еще и RequireJS, то это, конечно же, бред, не делайте так — в Ангуларе всё уже есть для DI.

    3) Если же вам нужна асинхронная подгрузка модулей, то используйте именно асинхронный загрузчик, без функционала DI (например, https://github.com/ded/script.js, да тысячи их) + Ангуларовский angular-loader.js, который позволяет загружать ангуларовские модули в любом порядке.
    Ответ написан
    Комментировать
  • В чём различия 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 комментария
  • Если ты турист, то можно ли устроиться на работу в Европе?

    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() на элемент, браузер сам прокрутит куда надо. (Извиняюсь, не заметил, что вопрос был задан год назад :)
    Ответ написан
    Комментировать