Как создать директиву datepicker angular, которая использует ng-model

Я создал директиву angular для моего jQuery UI datepicker. Проблема в том, что директива не обновляет входную ng-модель при выборе даты. Любая идея почему?

http://jsbin.com/ufoqan/1/edit

Ответы

Ответ 1

Угловой JS фактически предоставляет специальный контроллер для взаимодействия с ngModel, который вы можете использовать внутри своих директив; просто добавьте require: 'ngModel' в определение своей директивы.

Это дает вам четвертый параметр вашей функции link, которую вы запросили в require - в этом случае экземпляр из ngModelController. Он имеет метод под названием $setViewValue, который вы можете использовать для установки значения модели:

app.directive('datepicker', function() {
  return {
    require: 'ngModel',
    link: function(scope, el, attr, ngModel) {
      $(el).datepicker({
        onSelect: function(dateText) {
          scope.$apply(function() {
            ngModel.$setViewValue(dateText);
          });
        }
      });
    }
  };
});

Прекрасная вещь о ngModelController заключается в том, что она автоматически заботится о валидации и форматировании (в случае конкретного ввода type) и интеграции с такими вещами, как ngChange обратные вызовы; просмотрите этот пример: http://jsbin.com/ufoqan/6/edit

Ответ 2

Возможно, будет лучший способ, но это будет работать:

http://jsbin.com/ufoqan/4/edit

app.directive('datepicker', function() {
  return {
    link: function(scope, el, attr) {
      $(el).datepicker({
        onSelect: function(dateText) {
          console.log(dateText);
          var expression = attr.ngModel + " = " + "'" + dateText + "'";
          scope.$apply(expression);
          console.log(scope.startDate);
          // how do i set this elements model property ?
        }
      });
    }
  };
});

Вы также спросили, почему. Причина в том, что jquery происходит вне системы angular. Дополнительную информацию вы можете найти в разделе метода $apply: docs

Ответ 3

@Michelle Tilley и @Jonah прав насчет ссылки на вашу директиву на ngModel, но почему вы не использовали datePicker, который является чистым Angular вместо jQuery?
Ну, я представляю ADMdtp модуль. Это чистый AngularJs dateTimePicker с множеством вариантов greate:

  • полностью синхронизирован с ngModel, поэтому нет необходимости уничтожать или обновлять updateTimePicker.
  • выбор диапазона выбора; сделать так много dateTimePicker, как вы хотите связать вместе, и снова не нужно уничтожать или вручную обновлять каждый dateTimePicker.
  • шаблон disabing; так легко вы можете отключить любой день в неделю или месяц, как и все выходные.
  • переход на меняющиеся дни. (проклятия вы можете отключить в опциях)
  • получать полные данные даты, такие как дата в формате UNIX, формат даты и год, месяц, день, час и минута отдельно и... по атрибуту full-data.
  • ...

<adm-dtp ng-model="date" full-data="date_full"></adm-dtp>