2013-09-27 3 views
0

У меня есть директиву под названием реж с:

ng-model="job.start_date" 

comparison-date="job.end_date 

В scope.$watch("comparisonDate... я хочу, чтобы получить доступ к моей нг-модели значения. Проблема заключается в том, что область не определена в функции обратного вызова часов. Вопрос: Как я могу получить значение ng внутри этой функции?

.directive("dir", function() { 
    return { 
     scope: { 
      comparisonDate: "=", 
      ngModel: "=" 
     }, 

     link: function (scope, element, attrs, ctrl) { 
      var foo = scope.ngModel; 
      scope.$watch("comparisonDate", function(value, oldValue) { 
       console.log(value); //comparisonDate showing value properly 
       console.log(scope.ngModel); //Undefined 
        console.log(foo) //shows value but it's not refreshing. It shows allways the initial value 
      }) 
     } 
    }; 
}) 

вид ...

<input dir type="text" ng-model="job.start_date" comparison-date="job.end_date"/> 
+0

Сделайте console.log (область); ngModel может содержаться в области. $ parent или even scope. $ parent. $ parent в зависимости от вашего приложения. – geniuscarrier

ответ

1

Во время фазы связующей директивы, значение не может быть недоступна. Вы можете использовать $observe для наблюдения за изменением стоимости.

attrs.$observe("comparisonDate", function(a) { 
    console.log(scope.ngModel); 
}) 
+0

Боюсь, что это неверно. '$ observ' работает только с атрибутами, которые содержат интерполяцию, поэтому можно наблюдать только« @ »свойства; для контроля собственности с двусторонней привязкой, '$ watch' - это правильный путь. –

+0

@MichaelBenford No. Цель '$ observ' - отложить оценку. И нет причин, по которым он имеет дело только с интерполяцией, но не с нормальными атрибутами. – zsong

+0

действительно, но он работает только с атрибутами, которые содержат интерполяцию. Вы не можете использовать его для контроля свойства, связанного с '='. –

0

Попробуйте scope.$watch(attrs.comparisonDate, ...), а затем использовать attrs.ngModel

1

ng-model является встроенной директивой, которая говорит Угловой сделать двухстороннюю привязку данных. http://docs.angularjs.org/api/ng.directive:ngModel

Похоже, вы используете значение свойств одного и того же объекта job для сравнения. Если вы хотите придерживаться ng-model, вы можете использовать NgModelController: http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController

Затем измените вид:

<input dir type="text" ng-model="job"/> 

и изменить директиву:

.directive("dir", function() { 
    return { 
     require: '?ngModel', // get a hold of NgModelController 
     link: function (scope, element, attrs, ngModel) { 
      // access the job object 
      ngModel.$formatters.push(function(job){ 
       console.log(job.start_date); 
       console.log(job.end_date); 
      }); 
     } 
    }; 
}) 

Или вы можете изменить атрибут имя от ng-model к некоторым словам не зарезервировано. Например, измените вид вида:

<input dir type="text" comparison-start-date="job.start_date" comparison-end-date="job.end_date"/> 
+0

Вы можете использовать 'NgModelController. $ ModelValue', чтобы получить значение, связанное с элементом управления вводом, и сохранить оригинальную разметку OP. –

+0

@MichaelBenford Да, вы правы. Таким образом, оригинальная разметка OP не нуждается в изменении. Но он выглядит проводным, если вы можете использовать 'NgModelController' для доступа к объекту, а затем вам нужен другой атрибут, чтобы получить другое значение свойства одного и того же объекта. –

+0

Я согласен с тобой, что это странно, но если ОП реализует общую директиву, я полагаю, что свойство, связанное с 'ng-model', может быть совершенно другим, связанным с« датой сравнения ». Если это такой случай, я думаю, что оригинальная разметка имеет больше смысла. –

Смежные вопросы