2013-10-24 18 views
6

ui-bootstrapコンポーネントを使用してモーダル内に日付ピッカーを作成しようとしています。 datepickerは、unixタイムスタンプとしてフォーマットされた日付を返さなければなりません。モーダル内のdatepickerが機能しない

  1. 日付ピッカーをモ​​ーダル内にない場合、これは(=タイムスタンプの更新日付が選択されている場合)正常に動作している:http://plnkr.co/edit/9zHQQPGAcomT5Vha33j3?p=preview

  2. http://plnkr.co/edit/xQFmVgJojiq6aG9U8f4H?p=preview

  3. そして、私は、モーダル内のディレクティブを置きますここ

はコントローラである:

.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

あなたが範囲の問題に遭遇していると推測しなければならない場合は、ここでモーダルはコントローラのサブスコープを作成します。私はng-includeを使ってこれに遭遇しました。あなたのdtがどこに定義されているのか分かりません。私の解決策は私の「単純な価値」をコントローラーのオブジェクトに入れてサブスコープでアクセスできるようにすることでした。 [単純な性質は継承されなかった。オブジェクトは]。 – JeffryHouser

答えて

7

ng-modelの式で有名な「ドット」を使用する必要があります。これは、$ modalがウィンドウのコンテンツの前後範囲を作成しているためです。つまり、コントローラとモーダルのコンテンツの間にスコープが作成されます。

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

ワーキングここplunk:http://plnkr.co/edit/Adst8I8S0e0DLcVnhpLq?p=preview

とにかく、(これがベストプラクティスです)ng-model式でドットを使用すると、あなたのための問題を解決します

+1

+1私から;私は自分のコメントが正しい軌道にあったと思う... – JeffryHouser

1

timestampに対して行ったのと同じトリックを適用して、それをスコープのオブジェクトに入れてください。here

$scope.picker = { 
    dt: new Date(), 
    timestamp: '' 
}; 
関連する問題