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

    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 комментария
  • Почему не срабатывает обновление данных в AngularJS?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Ангулар ничего не знает о клике, повешенном через метод .on() — поэтому после клика Ангулару нужно принудительно сообщить об рефреше скоупа:

    a.on('click', function(e) {				
        var page = e.target.text;
    
        $scope.setPage(page);
    
        // обновляем скоуп
        $scope.$apply();
    });


    По поводу вообще всего в общем:

    В контроллере должна быть только логика — забудьте про жиКвери, забудьте про селекторы, выкиньте из головы жиКвери-подход — контроллеры ничего не знают о DOM-элементах, в контроллерах только логика.

    Прятать/показывать элементы нужно не по-жикверевски, через метод .css() (работая с DOM), а по-ангуларовски, через ng-show (работя с логикой).

    Задавать классы нужно не по-жикверевски, через метод .addClass() (работая с DOM), а по-ангуларовски, через ng-class (работя с логикой) (причем, ты задаешь классы .show/.hide — тут не классы нужны, тут используй ng-show, ведь ты же показываешь/прячешь).

    Вставлять элементы в DOM не нужно, это делается прямо в ХТМЛе, а не в контроллере:
    <ul class="pagination">
        <li ng-repeat="page in pages">{{page}}</li>
    </ul>


    Вешать события на элементы нужно не по-жикверевски, а прямо в ХТМЛе:
    <ul class="pagination">
        <li ng-repeat="page in pages" ng-click="openPage(page)">{{page}}</li>
    </ul>


    Да и вообще, там должна быть обычная ссылка, а не событие клика:
    <ul class="pagination">
        <li ng-repeat="page in pages">
            <a ng-href="/page/{{page}}">{{page}}</a>
        </li>
    </ul>


    И самое главное — удалите жиКвери. Он не нужен вообще-привообще, выкиньте из мозга саму концепцию жиКвери, выкиньте способ размышления на жиКвери — Ангулар работает совершенно по-другому.
    Ответ написан
  • Покритикуйте верстку, какие в ней есть ошибки?

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

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Да, можете, но это называется... говнокод. Ни в коем случае нельзя логику выносить из контроллера в шаблон (о, ужас) — так делают только говнокодеры, это так и никак иначе.
    Ответ написан
    Комментировать
  • Почему не работает код в angular?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Потому, что вы обнулили объект:
    this.newUser = {};
    Объекты в JS копируются по ссылке — если вы в одном месте что-то поменяли, то и в других местах объект изменится. Перед тем как вставлять объект в массив users нужно его клонировать.

    (P.S. В table не должно быть нетабличных элементов — неправильно делать form внутри tbody. )
    Ответ написан
    2 комментария
  • Зачем нужны комментарии после тега script?

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

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Жесть. При чем тут Ангулар? Вы думаете, что Ангулар еще и кашу умеет варить? Фреймворки реализуют архитектуру приложения, они не знают, что такое «прозрачные участки у изображения», когда день рождения у Анжелины Джоли и изберут ли Путина на третий срок — вы совершенно не понимаете даже о чем спрашиваете.

    И суть вашей проблемы тоже не понимаете — вам не прозрачные участки изображения нужно обрабатывать, совершенно мимо, вообще не то. И даже Яваскрипт здесь не при чем, вообще-привообще!

    Вам нужно через обычный CSS сделать border-radius нужной величины и задать background-image с картинкой и сделать background-size: cover; и background-position: center center;, а изображение не нужно делать круглым, изображение обычное, прямоугольное делайте, ибо скругление делается средствами CSS.
    Ответ написан
    7 комментариев
  • Как в Angularjs отобразить все данные из массива кроме данных из другого массива?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Ангулар тут не при чем вообще.

    У вас есть массив студентов, у каждого студента в данных есть индикатор, добавлен ли студент в какую-либо группу или не добавлен — типа, group_id: айдишка группы или null. Вот и фильтруйте по этому параметру.

    Либо сделайте два массива, для каждой таблицы свой, и с двумя массивами работайте — удаляйте/добавляйте.
    Ответ написан
    Комментировать
  • Как в $routeProvide прописать url если он постоянно меняется?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    reloadOnSearch: false (документация)
    Ответ написан
    Комментировать
  • Почему не работает ng-click в ng-repead - Angular?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    То, что вы прямо в ХТМЛ-коде пишете логику — гиперужасное дилетантство. На ng-click должна быть повешана функция, и уже в контроллере нужно писать логику, присваивать какие-то переменные и прочее, но ни в коем случае не в шаблоне, ибо получается уродское месиво.
    Ответ написан
    Комментировать
  • Какое событие происходит при замолкании 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);
    }


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

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    В первом комментарии всё верно и лаконично сказали — через $rootScope — я же просто разжую.

    Модуль ngRoute это просто обычный конфиг — вы в этот конфиг можете пихать всё, что вам угодно. Задайте каждой страничке уникальную айдишку или название категории странички:

    app.config(['$routeProvider',
      function($routeProvider) {
        $routeProvider.
          when('/main', {
            id: 'main',
            title: 'Главная',
            category: 'rootPage',
            templateUrl: 'mainPage.html',
            controller: 'MainPage',
          }).
          when('/powerSky', {
            id: 'powersky',
            title: 'Всем повер-скай, посоны',
            category: 'contentPage',
            templateUrl: 'template/powerSky.html',
            controller: 'PowerSky'
          }).      
          otherwise({
            redirectTo: '/main'
          });
      }]);


    Теперь, при каждой смене странички, в основном контроллере (это который общий для всех страниц сайта) пихайте в $rootScope конфиг текущей странички (текущего роута) в параметр page:

    app.controller('MainController', function($rootScope) {
      $rootScope.$on('$routeChangeSuccess', function(e, current, previous) {
        var page = current.$$route;
    
        // присваиваем глобально
        $rootScope.page = page;
      });
    });


    Теперь в HTML-шаблоне вставляйте класс для BODY:

    <!DOCTYPE html>
    <html ng-app="app">
        <head>
            <title>{{page.title}}</title>
        </head>
        <body ng-class="page.id" ng-controller="MainController">
            <main ng-view></main>
        </body>
    </html>


    Или, если у вас странички разбиты на некие общие категории, то не айдишку вставляем, а название категории (тогда меньше всяких классов нужно будет писать в CSS):

    <!DOCTYPE html>
    <html ng-app="app">
        <head>
            <title>{{page.title}}</title>
        </head>
        <body ng-class="page.category" ng-controller="MainController">
            <main ng-view></main>
        </body>
    </html>


    Ну и в стилях будет:

    body {
        &.rootPage {
            background-color: #fff;
        }
    
        &.contentPage {
            background-color: #ddd;
        }
    }
    Ответ написан
    Комментировать
  • Как использовать несколько $index во вложенных ng-repeat для angular.js?

    mudrick
    @mudrick
    Máximo progreso hemos alcanzado en minimo seso.
    Несколько $index'ов делаются так и никак иначе (всё остальное это какой-то ужас отвратный):

    <ul>
        <li ng-repeat="(i, items) in collection">
            <ul>
                <li ng-repeat="(j, item) in items">
                    {{i}} — {{j}}
                    Чекбокс: <input type="checkbox" name="field[{{i}}][{{j}}]">
                    <button ng-click="doSomething(i, j)">Клацнуть</button>
                    <button ng-click="buyItem(item.id)">Купить</button>
                </li>
            </ul>
        </li>
    </ul>


    Что же касается вашего вопроса о покупке, то покупать и фиксировать выбранный товар нужно не по индексам гатегории и подкатегории (это абсолюто неправильно), а по айдишке товара.
    Ответ написан
    2 комментария
  • Как в 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 комментария
  • Как добраться до объекта?

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

    var deferred = $q.defer(); // допустим, вы получаете промис из $q (а может быть из $http или $resource, я не знаю)
    console.log(deferred.promise); // возвратит объект, и там будет ваш $$state
    console.log(deferred.promise.$$state); // возвратит то, что внутри $$state
    console.log(deferred.promise.$$state.status); // возвратит status

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