2013-06-14 3 views
8

Может быть, это новобранец ошибка, но я не могу показаться, чтобы получить доступ к $scope.model «s $ngModelController так что я могу захватить $viewValue от него.

У меня есть вход без формы (им с помощью UI-маски директивы):

<input type="text" ng-model="inicio" name="inicio" ui-mask="99/99/9999"> 
// inside my controller 
$scope.inicio = dateFilter((new Date).getTime(), 'dd/MM/yyyy'); 

UI-маска установить $ modelValue другое значение, чем $ viewValue, что делает его трудно отправить отформатированный данные на сервер. Когда изменяется модель $scope.inicio, это значение без косой черты, например 01012014. Поэтому мне нужно получить контроллер для этого ввода, но без необходимости обертывать его в форме и использовать $scope.myForm.inicio.$viewValue. Он должен быть возможно ...

Вещи, которые я знаю, что я могу сделать, но, кажется Hacky, должна быть более простой способ:

  • Поместите элемент внутри формы и доступ к нему через $scope.myForm.input.$viewValue
  • Get элементные данные с помощью JQuery $('input[name="inicio"]').data('$ngModelController');
  • Получить элемент с помощью angular.element('input[name="inicio"]').controller('ngModel');
  • Создайте директиву, поместите его на входе, и обновить свою модель рамки с ней
app.directive('viewValue', function(){ 
    return { 
    priority: 10, 
    require: 'ngModel', 
    link: function(scope, element, attrs, controller){ 
     scope.$watch(attrs.viewValue, function(newValue, oldValue){ 
     if (newValue !== oldValue){ 
      scope[attrs.viewValue] = controller.$viewValue; 
     } 
     }); 
    } 
    } 
}); 
<input type="text" ui-mask="99/99/9999" ng-model="inicio" view-value="inicio"> 
+0

Почему класть элемент внутри тега формы хаки? – Stewie

+0

Мне не нужна форма, просто вход, мне не нужно использовать две модели для одной «простой» вещи, то есть доступ к 'ngModelController' на этом элементе, плюс наличие ввода без форма отлично подходит – pocesar

ответ

4

Мне нравится вариант директивы. По сути, директива ui-mask не делает то, что вы хотите, чтобы вы могли написать свою собственную директиву.

Вам не нужно передавать inicio в вашу директиву view-value. Вместо этого добавьте свой собственный парсер к ngModelCtrl.$parsers. Вот пример: https://stackoverflow.com/a/15556249/215945

+0

Значение, которое получает парсер, - это уже измененная дата без форматирования. директива не должна знать, какой формат должен быть ... что еще я могу сделать? – pocesar

+1

ах, я вижу, я просто возвращаю контроллер. $ ViewValue от него вместо того, чтобы пытаться преобразовать входной текст. хороший! – pocesar