datepicker внутри модального не работает
Я пытаюсь использовать компоненты UI-bootstrap, чтобы сделать datepicker внутри модального. Datepicker должен отправить назад дату, отформатированную как метка времени unix.
это работает нормально, если datepicker не находится внутри модального (=обновление метки времени при выборе даты):http://plnkr.co/edit/xQFmVgJojiq6aG9U8f4H?p=preview
затем я помещаю директиву внутри модального: http://plnkr.co/edit/9zHQQPGAcomT5Vha33j3?p=preview
вот контроллеры:
.controller('MyCtrl', [ '$scope', '$modal', function ($scope, $modal) {
$scope.open = function () {
var modalInstance = $modal.open({
templateUrl: 'tplModal.html',
controller: 'MyModalCtrl'
});
};
}])
.controller('MyModalCtrl', [ '$scope', '$modalInstance', function ($scope, $modalInstance) {
$scope.required= {};
$scope.disabled = function(date, mode) {
return ( mode === 'day' && ( date.getDay() === 0 || date.getDay() === 6 ) );
};
$scope.minDate = new Date();
$scope.$watch('dt', function() {
if ($scope.dt) $scope.required.timestamp = Math.floor($scope.dt.getTime() / 1000);
console.log('timestamp: ', $scope.required.timestamp, '/ dt: ', $scope.dt);
});
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
}]);
и html шаблон модального:
<div class="modal-body">
<div ng-model="dt">
<datepicker min="minDate" show-weeks="false"></datepciker>
</div>
<div>
dt <span class="uneditable-input span2">{{dt | date:'dd.MM.yyyy' }}</span>
dt <span class="uneditable-input span2">{{ dt }}</span>
timestamp <span class="uneditable-input span2">{{ required.timestamp }}</span>
</div>
</div>
в этой 2-й версии метка времени не обновляется при изменении даты (это похоже на то, что $watch не работал).
вы знаете, как это сделать?
2 ответов
вам нужно использовать знаменитую "точку" в ng-model
выражение как $modal создает область trasclusion для содержимого окна. Другими словами, существует область, созданная между вашим контроллером и содержимым modal.
в любом случае, используя точки в ng-model
выражение (которое является лучшей практикой) решает проблему для вас:
<div ng-model="dt.value">
<datepicker min="minDate" show-weeks="false"></datepciker>
</div>
и в JavaScript:
$scope.dt = {};
$scope.$watch('dt.value', function(newValue) {
if (newValue) $scope.required.timestamp = Math.floor(newValue.getTime() / 1000);
console.log('timestamp: ', $scope.required.timestamp, '/ dt: ', newValue);
});
рабочая планка здесь: http://plnkr.co/edit/Adst8I8S0e0DLcVnhpLq?p=preview
вам придется применить тот же трюк, что и для timestamp
и поместите его в объект в области, как я сделал здесь.
$scope.picker = {
dt: new Date(),
timestamp: ''
};