• Нужен ли INotifyCollectionChanged для коллекций если я его не использую?

    @Sumor
    Если хотите что-то проверить - создайте простой тестовый проект и посмотрите.

    Если у вас объекты реализуют INotifyPropertyChanged, то даже если они были привязаны к ItemsControl с помощью IEnumerable, привязанные (Binding) свойства в шаблоне обновятся. Они не пересоздадутся целиком, а именно обновятся те свойства, которые зависят от изменённых свойств вашего объекта. Например
    <ItemsControl>
      <ItemsControl.ItemTemplate>
        <DataTemplate>
             <TextBlock Text="{Binding Text}" Foreground="{Binding ForeColor}" />
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>

    При изменении свойства Text вашего объекта обновится текст элемента. При изменении цвета - обновится цвет.

    Но если вы в ItemsSource кладёте IEnumerable, то изменения собственно коллекции не отслеживаются. ни добавление, ни удаление. Если у вас изменилась коллекция вам нужно переприсваивать её заново и тогда будут заново созданы все визуальные элементы.
    Для отслеживания изменения коллекции она должна реализовывать INotifyCollectionChanged. Вы можете за основу взять коллекции ObservableCollection<> - они уже реализуют необходимые события.
    Соответственно, если в NotifyCollectionChanged будет указано, что добавился элемент - только он и отрисуется. Если элемент удалён - он и будет удалён. Остальные элементы не будут затронуты.
    Ответ написан
    1 комментарий
  • Что использовать для автокомпиляции less?

    Vadiok
    @Vadiok
    Веб разработчик
    Если хочешь, можешь взять мой код для gulp:
    В gulp-tasks/config.js прописывается:
    config.common = {
    	sourceDir: "source", // Общая папка для исходников, можно указать "." для корня
    	buildDir: "dist" // Общая папка для сборки "." для корня
    };
    config.css = {
    	buildDir: "style", // Папка для сборки стилей (внутри config.common.buildDir, указанного выше)
    	fileName: "style", // Имя получаемого CSS файла
    	autoprefixerOptions: "" // На свой вкус
    };
    config.less = {
    	// ...
    	sourceDir:    "style",  // Папка для исходников less стилей (внутри config.common.sourceDir, указанного выше)
    	mainFile:     "main", // Главный less файл, который будет собираться
    	// ...
    };

    Чтобы смотреть за файлами не только в директории исходников, надо в
    gulp-tasks/less.js, где [files] переписать на
    [files, "./js/components/**/*.less", "др. файлы, за кот. надо следить"]


    Запускать gulp less:watch
    Ответ написан
    Комментировать
  • Rest api: какую ссылку использовать для предпросмотра?

    @coderlex
    Запрос как на создание/изменение POST/PUT /resource_name + кастомный хэдер, например, X-Validate. По его наличию серверное API могло бы определять требуется ли только валидация или действительно сохранение ресурса.
    Ответ написан
    Комментировать
  • Почему асинхронный метод работает как отдельный поток?

    1. Поток не прерывается.
    2 DrawCounter();
    нужно скорее всего делать
    DrawCounter().Wait()
    или
    await DrawCounter();

    Иначе после первого await внутри DrawCounter
    управление попадает сразу сюда while(true) ShowMessage(DateTime.Now);

    3. Имеет значение контекст ,в гуи потоке по умолчанию по окончанию нового таска после await управление передается опять в поток гуи, здесь такого не будет.

    Дальше рекомендую погуглить и почитать подробнее. Лень много печатать.
    Ответ написан
    2 комментария
  • Как в Yii2 организовать "избранное"?

    AMar4enko
    @AMar4enko
    Делаете many to many, храните в профиле пользователя последнее время обновления избранного, сам список избранного храните в горячем кеше, например redis. При инициализации профиля выгребаете из кеша список избранного, или, если кеша нет или он просрочен относительно даты в профиле - актуализируете из базы. Кеш избранного будет в виде массивов id объектов, для определения "избранности" проверяете вхождение id объекта в массив.
    На чем делать - Yii, Django, Rails, Kohana - нет решительно никакой разницы, если владеете инструментарием.
    Ответ написан
    Комментировать
  • Yii2, работа с формами, как написать более сложную форму?

    metamorph
    @metamorph
    Ох.

    Ну, в общем, смотрите в сторону параметра fieldConfig (передается при создании виджета формы, вот тут <?php $form = ActiveForm::begin(); ?>), ну и там всякие options, cssOptions, template итд.

    Пример:
    $form = ActiveForm::begin([
        'id' => 'login-form',
        'options' => ['class' => 'form-horizontal'],
        'fieldConfig' => [
            'template' => '{label}<div class="col-sm-10">{input}</div><div class="col-sm-10">{error}</div>',
            'labelOptions' => ['class' => 'col-sm-2 control-label'],
        ],
    ]);


    Для того, чтобы понять, что куда идет, откройте файл vendor/yiisoft/yii2/widgets/ActiveForm.php, оно всё там (и неплохо документировано).
    Ответ написан
    3 комментария