изменить значение ng-модели из директивы

По сути, я пытаюсь написать директиву для выбора даты. В этой директиве я использую переменную ng-model, чтобы отразить измененное значение в родительском контроллере. Но у меня есть некоторые проблемы с этим. Я не знаю, как установить начальное значение переменной ng-model. Во-вторых, я не понимаю, как обновить переменную ng-model и выполнить ее проверку.

Я пробовал что-то вроде этого.

angular.module("mainModule.directives").directive('datePicker', function () {
    var directive = {
        restrict: 'E',
        replace : false,
        template : '<input ng-model="date" type="text"/>',
        require : 'ngModel',
        scope : {},
        link : function($scope, elem, attr, ngModelCtr) {
            $scope.date = ngModelCtr.$viewValue;

            function fromUser(text) {
                $scope.date = ngModelCtr.$viewValue;
            }

            function toUser(text) {
                ngModelCtr.$setViewValue($scope.date);
            }

            ngModelCtr.$parsers.push(fromUser);
            ngModelCtr.$formatters.push(toUser);
        }
    };

    return  directive;
});
<date-picker ng-model="modelDate"></date-picker>

person Vaibhav Raut    schedule 28.12.2014    source источник
comment
после того, как я изменил переменную даты директивы, она должна отражаться в переменной ng-models, т.е. modelDate, а также устанавливать параметры проверки из директивы   -  person Vaibhav Raut    schedule 28.12.2014
comment
Вам нужно реализовать ngModel.$render() для передачи значения модели в представление. И тогда каким-то образом (зависит от точной реализации директивы) вам нужно вызвать ngModel.$setViewValue(value), чтобы обновить модель из пользовательского интерфейса. См. пример внизу документов.   -  person Nikos Paraskevopoulos    schedule 28.12.2014


Ответы (2)


Парсеры и средства форматирования работают с существующим значением и, я думаю, должны возвращать проанализированный или отформатированный результат. Вы можете установить ngModelController.$render для функции, которая будет вызываться при изменении значения, а затем использовать ngModelController.$setViewValue для обновления значения, когда вы хотите. Вот скрипт, показывающий использование momentjs для обновления базовой модели только в том случае, если введена действительная дата (скрипка):

link : function(scope, elem, attr, ctrl) {
    ctrl.$render = function() {
        scope.date = moment(ctrl.$viewValue).format("YYYY-MM-DD");
    };
    scope.$watch('date', function(newValue, oldValue) {
        // only update if it is a valid date string
        var m = moment(newValue);
        if (m.isValid()) {
            ctrl.$setViewValue(m);
        }
    });
}
person Jason Goemaat    schedule 28.12.2014

вам нужно отобразить viewValue в DOM с помощью

ngModelController.$render()
person hjl    schedule 28.12.2014