Задать вопрос
  • Какое самое короткое выржение на JS, выдающее в результате True?

    0xD34F
    @0xD34F Куратор тега JavaScript
    в таблице рекордов (которую заполнял вручную автор по запросам на почту) были люди, выполнившие эту задачу за 1 символ. Вопрос: какой это был символ или как иначе они это сделали?

    Символ, полагаю, никакой - поскольку проверка решения выполняется на клиенте, просто подменили функцию или результат проверки через отладчик, ничего вручную автор там не заполняет. Можно и решение из 0 символов оформить как корректное.
    Ответ написан
    1 комментарий
  • Зависимость нескольких select-ов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    каким образом сделать зависимость? То есть select model не должен быть активен пока select brand не выбран

    Например, так. Добавляете в объекты, на основе которых создаются элементы управления, свойство value, передаёте его в v-model соответствующего элемента (надо будет реализовать v-model для вашего dropdown'а). Делаете computed свойство formData на основе этих value. И задаёте элементам v-if - если элемент имеет зависимость, то пока соответствующее поле в formData не заполнено, элемент не создаётся (или disabled реализовываете - с аналогичной логикой).

    как в select model передать данные, которые выводятся в консоль после выбора объекта?

    Ну, НАВЕРНОЕ, вместо вывода в консоль эти данные куда-то сохранить надо - и передавать оттуда в соответствующий dropdown.
    Ответ написан
  • Как корректно реализовать метод "battle" в моей мини игре?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Во-первых - у вас неправильное условие окончания боя. Ошибка тривиальная, так что тут ничего более не скажу, думайте сами.

    Во-вторых - фантастически козлиная реализация самого метода battle в целом. Почему этот метод должен знать о конкретных экземплярах Unit? Не должен. Что, при изменении состава команд полезете его исправлять? Это абсурд.

    Отсюда, кстати и происходит упомянутый вами "беспрерывный бой" - поскольку вы каждому члену обеих команд назначили в противники кого-то конкретного из другой команды раз и навсегда, то... как вы думаете, какова вероятность, что сразу всем членам одной команды удастся одолеть своих противников? - часто получается так, что в одной из команд жив один её участник, а в другой два - и они никак не взаимодействуют.

    Надо сделать так, чтобы участники команд не были привязаны к конкретному противнику раз и навсегда. Можно добавить в Team метод kick (аналогично таковому в Unit), где будет осуществляться выбор - кто кого атакует (например, участники команды по очереди атакуют случайного участника другой команды). Ну и соответственно, использовать этот метод в battle, типа так.
    Ответ написан
    2 комментария
  • JQuery UI datepicker - как увеличить количество option'ов для SELECT с выборов года?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Свойство yearRange.
    Ответ написан
    Комментировать
  • Как заставить перестать моргать форму авторизации?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавьте третье состояние, оно же дефолтное - неопределённость, непонятно, авторизован пользователь, или нет:

    data: () => ({
      auth: null,
    }),
    methods: {
      checkUser() {
        ...
        // указываем false только в случае отрицательного результата проверки
        this.auth = false;
        ...
      },
    },

    <template v-else-if="auth === false">
      ФОРМА АВТОРИЗАЦИИ
    </template>
    Ответ написан
  • Сортировка по блокам в зависимости от даты?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Можно как-то в зависимости от даты отсортировать данные из массива по этим блокам?
    То есть в блок "Сегодня" уходит 2018-05-28
    В блок "Вчера" 2018-05-27

    Да запросто - сделайте несколько computed свойств, соответствующих нужным дням, простая фильтрация массива по дате. И в каждом из блоков используйте соответствующее свойство вместо исходного массива.
    Ответ написан
    Комментировать
  • Как заполнить динамически созданные input через v-model?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавьте свойство value каждому элементу массива, его и указывайте в v-model. А item сделайте из обычного свойства вычисляемым.

    data: () => ({
      entity: [
        { id: 1, name:   'title', value:   'default title' },
        { id: 2, name: 'address', value: 'default address' },
      ],
    }),
    computed: {
      item() {
        return this.entity.reduce((acc, n) => (acc[n.name] = n.value, acc), {});
      },
    },

    <div v-for="n in entity" :key="n.id">
      <label>
        {{ n.name }}
        <input type="text" v-model="n.value">
      </label>
    </div>
    Ответ написан
    Комментировать
  • Angular 2 ngFor?

    0xD34F
    @0xD34F
    Вместо this.listers = data['in']; пусть будет

    this.listers = Object.entries(data.in).map(([key, val]) => ({ key, val }));

    Тогда при переборе listers в ngFor ключи будут доступны как item.key, а значения - как item.val.
    Ответ написан
    Комментировать
  • Как добавить обработчик событий к группе элементов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    На div с id 98 и 99 клик работает

    Да ну? Нечему там работать, вот эта штука

    greet: function () {
        alert('Привет!');
    }

    должна находиться в methods. От которого у вас одна закрывающая скобка (wtf??!).

    когда делаю так
    template: '<div class = "brick"  v-on:click="greet">{{ brick.text }}</div>'

    выдает ошибку реактивности

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

    Какие есть варианты исправить ситуацию:

    • Слушать снаружи нативное событие, добавив соответствующий модификатор:

      <brick-item @click.native="greet" ...

    • Эмитить событие изнутри компонента при клике по корневому элементу:

      <div @click="$emit('click')" ...

    • Добавить корневому элементу компонента передаваемые ему слушатели событий.

      Можно конкретно click: <div @click="$listeners.click" ...
      А можно - всё, что есть: <div v-on="$listeners" ...

    Ответ написан
    Комментировать
  • Как сделать масштабирование Яндекс.Карты при скрытии/отображении коллекции?

    0xD34F
    @0xD34F Куратор тега Яндекс.Карты
    Для этого воспользуйтесь методами setBounds и getBounds. Типа так.

    UPD. Вынесено из комментариев:

    А можно регулировать масштаб? Сейчас максимально приближено. Можно установить значение zoom 15, например?

    Можно проверять после вызова setBounds текущий зум, и если больше допустимого - устанавливать сколько надо. Типа так.
    Ответ написан
    3 комментария
  • Почему для хелпера нужно создавать экземпляр?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что методы принадлежат непосредственно экземпляру, а не конструктору. Хотите вызывать их у конструктора - ну так сделайте их его свойствами. Правда, не очень понятно, зачем тут вообще конструктор - пусть это будет простой объект, содержащий нужные методы:

    const random = {
      intFromInterval: (min, max) => Math.floor(Math.random() * (max - min)) + min,
      intFromZero: (max) => Math.floor(Math.random() * max),
    };
    
    console.log(random.intFromInterval(55, 66));
    Ответ написан
    Комментировать
  • Как сделать, чтобы NodeList.prototype.forEach заработал в Internet Explorer?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вариант раз, воспользоваться forEach'ем массива:

    Array.prototype.forEach.call(cards, function(cardDiv) {
      // ...
    });

    Вариант два, переписать через цикл for:

    for (var i = 0; i < cards.length; i++) {
      var cardDiv = cards[i];
      // ...
    }

    Вариант три - найти и добавить полифилл.
    Ответ написан
    1 комментарий
  • Почему вотчер не возвращает старое значение?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Добавление элементов в массив (удаление, изменение), как и аналогичные действия над объектами - они не приводят к созданию нового массива/объекта. Так что всё правильно - старые и новые значения одинаковы.

    Чтобы иметь доступ к предыдущему значению, надо создавать новый массив. Т.е., например, сейчас у вас есть this.array.push('hello'). Вместо этого делайте this.array = [ ...this.array, 'hello' ].

    Аналогично и с объектами - вместо какого-нибудь this.obj.prop = value будет this.obj = { ...this.obj, prop: value }.

    UPD.

    watch: {
        array: function (o, n) {
          this.oldData = o
          this.newData = n
        }
      }

    У вас тут старое и новое значение местами перепутаны.
    Ответ написан
    Комментировать
  • Как разрезать картинку на много частей?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Первое что приходит в голову это создать блоки нужного размера и настроить позицию фона.
    Но что-то мне подсказывает, что это не лучшее решение

    Нормальное решение. Простое и короткое.

    Как бы вы это сделали с позиции проектирования и производительности?

    Что вы понимаете под "позицией проектирования" я без понятия, а что до производительности - сперва стоит сделать хоть как-нибудь, оптимизацией займётесь потом (если надо будет).

    Никогда не имел дела с Canvas, насколько я понимаю, он тут тоже может помочь

    Может. Только при чём тогда тут Vue, указанный вами в тэгах?
    Ответ написан
    1 комментарий
  • Как изменить набор слайдов в vue-slick?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Использую карусель vue-slick...

    Я так понимаю, вы говорите про эту?

    Есть кнопка "добавить слайд", после которой нужно "перезапустить" слайдер. <...> Пробую использовать в методе добавления слайда this.$refs.slick.$reSlick(), ничего не получается.

    Что неудивительно - внутри reSlick карусель уничтожается и сразу же создаётся. При уничтожении вся внутренняя разметка кроме картинок вырезается, сами же картинки slick держит в отдельном div'е - то есть, только что добавленный слайд попадает в корневой элемент slick'a и сразу же удаляется.

    Так что порядок действий при изменении набора слайдов должен выглядеть как-то так - уничтожить карусель, изменить разметку, создать карусель. То есть, вызов $refs.slick.destroy; затем изменение данных, на основе которых строится разметка слайдов; и наконец, вызов $refs.slick.create, обёрнутый в $nextTick.

    Заниматься подобной ерундой особого смысла не вижу, лучше будем уничтожать и создавать заново экземпляр самого компонента. Для этого назначим ему key, чьё значение будет зависеть от набора данных, на основе которых строится разметка слайдов. Например.
    Ответ написан
    Комментировать
  • Как можно сделать движение плавным в css animation(keyframes)?

    0xD34F
    @0xD34F Куратор тега CSS
    нужно вращать сначала медленно, потом быстро, потом опять медленно

    Так?

    Ну и вообще - вам стоит почитать про временные функции.
    Ответ написан
    2 комментария
  • Как решить проблему с transition-group?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Задайте :key для списка задач в целом, чтобы он рендерился заново при смене активного списка. Например, так:

    <transition-group name="trgroup" :key="active.name">

    Демо.
    Ответ написан
    8 комментариев
  • Как реализовать динамическое сравнение массивов на основе чекбоксов?

    0xD34F
    @0xD34F Куратор тега React
    Для хранения выбранных значений можно использовать объект, имена свойств которого соответствуют индексам групп чекбоксов, а значения будут массивами значений, соответствующих чекбоксам выбранной группы (вперемешку, без разделения по конкретным чекбоксам). В обработчике клика чекбокса в зависимости от его checked дописываете или выбрасываете значения группы.

    Для вывода значений, выбранных во всех группах берёте массив выбранных значений любой группы, и фильтруете его с условием, что элемент массива присутствует во всех массивах выбранных значений групп.

    Выглядеть это может так, например:

    class App extends React.Component {
      state = {
        selected: {},
        groups: [
          [
            [ 'value_a1', 'value_a2', 'value_a3' ],
            [ 'value_b1', 'value_b2', 'value_b3' ],
            [ 'value_c1', 'value_c2', 'value_c3' ],
          ],
          [
            [ 'value_a1', 'value_b1', 'value_c1' ],
            [ 'value_a2', 'value_b2', 'value_c2' ],
            [ 'value_a3', 'value_b3', 'value_c3' ],
          ],
        ],
      }
    
      onChange = (e, groupIndex, itemIndex) => {
        const selectedGroup = this.state.groups[groupIndex][itemIndex];
        const selectedInfo = this.state.selected[groupIndex] || [];
    
        this.setState({
          selected: {
            ...this.state.selected,
            [groupIndex]: e.target.checked
              ? selectedInfo.concat(selectedGroup)
              : selectedInfo.filter(n => !selectedGroup.includes(n))
          },
        });
      }
    
      render() {
        const { selected, groups } = this.state;
        const matched = (selected[0] || []).filter(n => {
          return groups.every((group, i) => (selected[i] || []).includes(n));
        });
    
        return (
          <div>
            {groups.map((group, groupIndex) => (
              <ul>
                {group.map((item, itemIndex) => (
                  <li>
                    <input
                      type="checkbox"
                      onChange={(e) => this.onChange(e, groupIndex, itemIndex)}
                    />
                    {item.map(val => <span>{val}</span>)}
                  </li>
                ))}
              </ul>
            ))}
            <div>
              {matched.map(val => <span>{val}</span>)}
            </div>
          </div>
        );
      }
    }
    Ответ написан
    1 комментарий