Ответы пользователя по тегу JavaScript
  • Перерисовывает ли AngularJS DOM?

    @lega
    Вы можете проверить конкретный случай, например пометить один элемент, например изменить текст/цвет. После чего спровоцировать "перерисовку", если все отработает корректно, а текст/цвет останется, то этот элемент был не тронут (не "пересоздан").

    ng-repeat создает соответствия элемент массива <-> элемент DOM, на подобии match[ $id(model) ] = element, если при следующей "перерисовке" нет DOM элемента для элемента массива match[ $id(model) ] == null, то создается новый DOM элемент. "Ключ $id(model)" можно изменить через track by.
    Ответ написан
    Комментировать
  • Как можно заменить инструкцию jquery $(element).html() функцией на чистом javascript?

    @lega
    youmightnotneedjquery.com - Код на jQuery и аналоги для JS
    Ответ написан
    Комментировать
  • Как сделать открытие/закрытие блока при нажатии?

    @lega
    Вот тоже самое что и у Pavel Demyanenko только без js! и jQuery (но с Angular Light).
    Там все просто:
    al-click="tab='b'" - при клике присвоить tab='b'
    al-show="tab=='b'" - отобразить блок если tab == 'b'

    Вам нужно попробовать какой-нибудь MV* фреймворк, с ними проще делать сложные приложения.
    Ответ написан
    Комментировать
  • Насколько широко сейчас можно применять рендер на клиенте?

    @lega
    Разделяйте проекты на сайты и веб-приложения (с последним думаю все понятно - одна страница, все в ней).
    Но смущает, что поисковики не будут ничего видеть. Да и юзеру вроде как не комфортно, открыл страничку а там ничего, пока скрипты не отработали.
    Считаю что с поисковиками проблем особо нет (phntomjs/prerenderio), а вот скорость загрузки - это существенно, поэтому я считаю что основной контент должен прилетать сразу с сервера, чтобы пользователь уже мог читать, а доп. функционал, всякие формы, кнопки, др. плюшки уже через клиентские фреймворки. Например VK, большая часть прилетает сразу, а остальное - поиск, подгрузка уже через js (хотя подгружаемые посты ренедрились на сервере).
    Ответ написан
    Комментировать
  • Почему mithril, vue, virtual-dom быстрее react?

    @lega
    Тесты замеряют разные действия, где-то добавление, где-то изменения, одни фреймворки быстрее в одном, другие в другом, отсюда и разные результаты.
    Ещё сами тесты вызывают сомнения, например в первом тесте у Angular.js приделан setTimeout что-бы не делать перерисовку на каждой итерации + при этом сам тест запускается не асинхронно - это "читерство".
    А при выполнении теста с React у меня браузер дергается (видимо из-за особого контента который выводится) - это бъёт по производительности, - возможно это было нарочно сделано. Так же каждый последующий тест работает в поле где есть "мусор" от всех предыдущих тестов - это тоже может снижать цифры.

    Тут есть хабра-тест (сделанный пользователями с хабра), он более менее причесан, тестирует добавление/изменение, но тут React тоже не блещет, возможно React хорош в каких-то специфических случаях, хотя я видел много бенчмарков с React, и он нигде не имел особого преимущества.

    PS: Если вас не затруднит, не могли бы вы сюда добавить mithril или vue для сравнения.

    Дополнил про React
    Я особо не копал React, у меня такие мысли - они реализовали виртуальным DOM который максимально эффективно превращает один кусок документа в другой, проблема в том что на практике это не нужно - в других фреймворках делают просто сокрытие одного куска и показ другого куска - и это работает быстрее, чем перестройка DOM. Так же я слышал заявления, что React работает быстрее за счет того что они не делают чтения из DOM - видимо они сравнивают с jQuery (и vanilla js), т.к. в других MV* фреймворках, чтения из DOM делаются не часто (или только на стадии инициализации).
    Ответ написан
    Комментировать
  • А в чем минусы node.js?

    @lega
    Как выше сказали - большой проект разрабатывать на node.js не желательно из-за сложности (сравните 2 псевдо-примера), - будете иметь больше проблем, потратите в разы больше времени.

    В большинстве случаев асинхронность нужна для 0-5% от проекта, поэтому не нужно из-за этих 5%, остальные 95% делать асинхронными.
    Асинхронность нужна не везде.
    Ответ написан
    Комментировать
  • Знаете ли вы js библиотеку с two way binding, хранящую все данные в html?

    @lega
    Таким образом ей можно было бы подсунуть, допустим хтмл сгенерённый на сервере.
    Идея интересная, можно использовать ng-init или сделать аналог, сделал пример на angular light
    Likes: <span al-take-value="likeCount" al-text="likeCount">15</span>

    До загрузки приложения отображает "Likes: 15", когда приложение загрузится, директива al-take-value возьмет значение элемента, когда с сервера будет прилетать информация, то текст будет обновляться с пом. директивы al-text, хотя для более сложных данных вариант с json + ng-init может быть удобнее.

    Или другие библиотеки могли бы менять html, а эта библиотека работала бы с ним так же как если бы изменения сделаны были через неё.
    Можно сделать спец. директивы для этого, но я думаю что это плохое решение, тем более оно не будет работать например с jquery компонентами такими как select2, там идет подмена элементов, есть реализации datepicker где нужно работать через js, и т.д.
    Ответ написан
    Комментировать
  • Angular. Как передать параметр в функцию из шаблона и вызвать get?

    @lega
    Вы можете изменить метод после первого вызова, что-бы он отдавал результат, например так:
    $scope.myFunc = function(id) {
        var result = 'loading...';
        $scope.myFunc = function() { return result };
        $http.get($scope.url).success(function (data) {
            result = data;
        })
        return result
    };
    Ответ написан
  • Стоит ли использовать AngularJS вне концепции SPA?

    @lega
    а сам Angular использовать без роутинга в целях построения частей сложных интерфейсов

    Можете попробовать Angular Light, он "между" Knockout.js и Angular.js, для построения "частей интерфейса" он может быть удобнее.
    Ответ написан
    Комментировать
  • Путаница с контекстом в JS

    @lega
    Вы поместили classes и get в один объект через this (например выполнив: obj = new Container(); или obj = {}; Container.call(obj);)
    Когда вы будете вызывать ф-ию таким образом: obj.get(), этот obj будет передан в ф-ию как this в котором лежат classes и get (потому что вы вызываете get как бы из obj).

    Так же вы можете подменить (this) если вызовете метод через call/apply: obj.get.call({}, 'simple'), в таком случае вы получите "this.classes - undefined".
    Ответ написан
    Комментировать
  • Что такое prototype в javascript?

    @lega
    Что такое prototype в javascript?

    По простому, это возможность использовать объект (ф-ию/переменную) "родителя" (прототипа) если нет своего объекта.
    Например вы пытаетесь вызвать ф-ию form1.echoX(), т.к. её нет будет попытка вызвать form1.__proto__.echoX(), если этой нет то form1.__proto__.__proto__.echoX() и т.д.
    Как "заполнять" прототип, можете найти в "любом" учебнике по JS, так же @rock привел пример.
    Ответ написан
    Комментировать
  • Какие преимущества у AngularJS vs KnockoutJS?

    @lega
    Да и по производительности он уступает:

    Есть ещё такой тест который показывает обратное: plnkr.co/edit/leZaT043Yffz4LfG8Ykq?p=preview

    Я перешел от Knockout.js к Angular.js (а потом и к Angular Light), вот некоторые минусы первого:
    1) В ng есть декларативный биндинг, в ko нет (раньше не было), хотя недавно натыкался на какие-то решения.
    2) Из-за того что в angular dirty check - не нужно заворачивать данные в observable, это очень удобно.
    3) В ng можно без проблем оперировать с данными (большие вычисления), в ko для этого нужно достать данные из observable, провести операции, потом положить обратно.
    4) Так же в ko происходит "мгновенное" обновление, что несет 2 неприятности: 1) нагрузка, возможно не нужно обновлять именно сейчас 2) иногда нужно учитывать порядок обновления данных, т.к. зависимые расчеты могут сломаться.
    5) Есть ещё не маленькая неприятность, когда в большом проекте нужно сделать доработку - и нужно сделать обычную переменную как observable - заставляет рефакторить, или наоборот перевести из observable в обычную для оптимизации, этой проблемы в angular нет.

    Можете так же посмотреть Angular Light, он попроще, + есть некоторые полезные фичи которых нет в Angular.js
    Ответ написан
  • Как осуществить переход между списком и детальной страницей (MVVM)?

    @lega
    Сейчас при каждом возврате "назад" список ререндерится.
    Зачем? Его можно просто скрывать. Там скорее всего так и сделано.
    Ответ написан
    2 комментария
  • Что может Angular JS?

    @lega
    Любая работа с DOM заворачивается в директивы, так же (в теории) любой jQuery плагин можно завернуть в директиву, на случай если нет готовой директивы. Не рекомендуется работать с jQuery напрямую.
    Обратите внимание ещё на Angular Light, возможно он вам больше понравится.
    Ответ написан
    Комментировать
  • Как осуществить пересвязку данных в Angular.js?

    @lega
    Если не сильно критично, то можете попробовать Angular Light, он удобнее для встраивания в готовое приложение. См. 5-ый способ привязывания, он может вам подойти.
    Ответ написан
  • Как реализовать внедрение Angular.js зависимостей в существующий проект?

    @lega
    Посмотрите на Angular Light, для встраивания в готовую "структуру" он может быть удобней.
    Ответ написан
  • Как можно усовершенствовать мой примитивный код?

    @lega
    Вам нужно что-то более "высокоуровневое", например на Angular Light ваш пример работает "без js": jsfiddle.net/lega911/S6Pzx
    Ответ написан
    Комментировать
  • Angular vs Knockout на больших списках

    @lega
    Для Angular, в массиве нужно хранить словари вместо чисел, иначе вместо теста "update" будет "fill", это из-за того, что в простые типы нельзя поместить идентификатор и для ангулара список с числами будет каждый раз как новый, и вместо "update" сначала происходит удаление DOM, а потом "fill".
    Поправил тест, для Angular.js улучилось время "updating", так же добавил тест для Angular Light:
    jsfiddle.net/lega911/ZUne7
    Ответ написан
    Комментировать