2013-10-24 35 views
6

Próbuję użyć komponentów ui-bootstrap, aby utworzyć datepicker wewnątrz modalu. Datepicker musi odesłać datę sformatowaną jako uniksowy znacznik czasu.datepicker wewnątrz modalu nie działa

  1. to działa dobrze, jeśli datepicker nie jest wewnątrz modalnego (= aktualizacje datownika, gdy wybrana jest data): http://plnkr.co/edit/xQFmVgJojiq6aG9U8f4H?p=preview

  2. Potem umieścić dyrektywę wewnątrz modalne: http://plnkr.co/edit/9zHQQPGAcomT5Vha33j3?p=preview

oto kontrolery:

.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'); 
    }; 
}]); 

i szablon html z modalnym:

<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> 

W tym 2nd wersji datownik nie aktualizuje gdy data jest zmieniana (to jakby $ zegarek nie działa).

Czy wiesz, jak to zrobić?

+2

Jeśli miałbym zgadywać, masz problem z zasięgiem; gdzie modal tworzy podskręt kontrolera. Wpadłem na to przy użyciu ng-include. Nie widzę, gdzie jest zdefiniowany twój dt; ale moim rozwiązaniem [w moim przypadku] było umieszczenie mojej "prostej wartości" w obiekcie kontrolera, aby był dostępny w podmiarze. [proste właściwości nie zostały odziedziczone; ale obiekty były]. – JeffryHouser

Odpowiedz

7

Musisz użyć słynnej "kropki" w wyrażeniu ng-model, ponieważ $ modal tworzy zasięg dla zawartości okna. Innymi słowy, istnieje pewien zakres pomiędzy twoim kontrolerem a treścią modalu.

W każdym razie, za pomocą kropki w wyrażeniu ng-model (co jest najlepszą praktyką) rozwiązuje problem dla Ciebie:

<div ng-model="dt.value"> 
    <datepicker min="minDate" show-weeks="false"></datepciker> 
</div> 

iw 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); 
}); 

robocza rzucać tutaj: http://plnkr.co/edit/Adst8I8S0e0DLcVnhpLq?p=preview

+1

+1 ode mnie; Myślę, że mój komentarz był na właściwej drodze ... – JeffryHouser

1

Będziesz musiał zastosować tę samą sztuczkę, którą zrobiłeś dla timestamp i umieścić ją w obiekcie na lunecie, tak jak ja here.

$scope.picker = { 
    dt: new Date(), 
    timestamp: '' 
}; 
Powiązane problemy