2015-09-04 81 views
1

技术: AngularJs和Bootstrap-UI自举的UI日期选择器近距离上的最新选择

环境: 我使用由 “FilterCtrl” 控制的collabsable滤波器部。过滤器中的每个输入元素都由嵌套控制器(如“TypeaheadCtrl”或“DatepickerCtrl”)控制。每个人的ng模型都绑定到FilterCtrl中的“$ parent.field”。

问题: Datepicker工作正常,exept,这是问题,它不关闭。根据默认设置(https://angular-ui.github.io/bootstrap/#/datepicker),日期选择器应该在选择日期时关闭。它不是。即使我点击按钮栏的“关闭”按钮,它也不会。如果焦点改变,它确实关闭。

HTML:

<div class="" ng-controller="FilterCtrl"> 
    <a class="black bold nodecoration" ng-click="isCollapsed = !isCollapsed" role="button">Filter</a> 
<!-- Filter --> 
    <div class="bckgrnd-lgrey bordered max-width" collapse="isCollapsed" id="findenFilter"> 
    <div class="nobreak" ng-controller="TypeaheadCtrl"> 
     <label>Suchbegriff: 
     <input ng-model="$parent.searchText" placeholder="z.B. Rock" type="text" typeahead="prediction for prediction in predictions | filter:$viewValue |limitTo:8"></label> 
    </div> 
    <div class="nobreak" ng-controller="DatepickerCtrl"> 
     <label>Datum: 
     <input class="" close-text="Close" datepicker-popup="{{format}}" is-open="status.opened" ng-click="open()" ng-model="$parent.selectedDate" show-weeks="false" type="text"> 
    </div> 
    <div class="nobreak"> 
     <label>Land: </label> 
    </div> 

    <button type="button" name="button" ng-click="printValues()">log values</button> 
    </div> 

</div> 

JS: DatepickerCtrl:

angular.module('tbdApp') 
    .controller('DatepickerCtrl', function($scope) { 
    this.awesomeThings = [ 
     'HTML5 Boilerplate', 
     'AngularJS', 
     'Karma' 
    ]; 
    $scope.today = function() { 
     $scope.selectedDate = new Date(); 
    }; 
    $scope.clear = function() { 
     $scope.selectedDate = null; 
    }; 
    $scope.open = function($event) { 
     $scope.status.opened = true; 
    }; 


    $scope.status = { 
     opened: false 
    }; 

    $scope.formats = ['dd.MM.yyyy', 'dd-MMMM-yyyy', 'yyyy/MM/dd']; 
    $scope.format = $scope.formats[0]; 
    $scope.today(); 
    }); 

FilterCtrl:

angular.module('tbdApp') 
    .controller('FilterCtrl', function ($scope) { 
    this.awesomeThings = [ 
     'HTML5 Boilerplate', 
     'AngularJS', 
     'Karma' 
    ]; 
    $scope.isCollapsed = false; 
    $scope.selectedDate = null; 
    $scope.searchText = null; 
    $scope.printValues = function() { 
     console.log("collapsed: " + $scope.isCollapsed); 
     console.log("selectedDate: " + $scope.selectedDate); 
     console.log("searchText: " + $scope.searchText); 
    } 
    }); 

我没有发现任何人谁也有类似的问题。我想这可能是一个范围问题,但我不知道这个问题可能是什么。

+0

我不能发布两个以上的链路:') 因此,继承人的最后一部分: “关闭()” 中的https://当我点击“关闭”时应该调用github.com/angular-ui/bootstrap/blob/master/template/datepicker/popup.html。 https://github.com/angular-ui/bootstrap/blob/master/src/datepicker/datepicker.js#L779 或者当我选择一个日期时,它应该调用https://github.com/angular-ui /bootstrap/blob/master/src/datepicker/datepicker.js#L706 – Ore

+0

尝试用你的代码在plunkr中创建一个例子。我们会更容易帮助你。 –

+0

好吧,我明白了。它令人难以置信的丑陋,但作品以及原始版本 - 有点但不是100%。 PS:Collabse在PLUNK示例中不起作用。但它没有必要解决这个问题。 – Ore

回答

1

因此,根据您的plunkr示例,我确定的问题是在您的输入事件。取而代之的

ng-click="open()" 

ng-focus="open()" 

这种情况由于您选择的日期之后,angularjs尝试单击事件移动到输入框。不知道为什么,但这是行为。

+0

非常感谢。这解决了我的问题,但又产生了另一个问题。它现在用“关闭”按钮和on-select-close正确地关闭了日期选择器,但是关闭后的焦点位于输入框上,并且使得它不可能再次触发事件,而无需在输入框上单击某处并再次点击。你对这个问题有一个聪明而灵活的解决方案吗?有问题,我不想更改外国代码(迁移恐怖)https://github.com/angular-ui/bootstrap/blob/master/src/datepicker/datepicker.js#L781 – Ore

+0

那么,如果你看看他们在这里提供的演示https://angular-ui.github.io/bootstrap/对于datepicker,你描述的行为是默认行为。我认为在不更改库代码的情况下,可以尝试观察将通过日期选择更改的模型值,然后专注于其他元素。不过,根据我的经验,在选择日期之后,我从不需要从输入中移除焦点。 –

+1

今天面临同样的问题。观察模型值并在目标输入上调用'blur()'对我来说不是一种选择,因为**切换月份也会触发焦点丢失**,而datepicker只会关闭自身。经过一番调查,我发现如果autoClose选项存在'scope。$ emit('hidePicker');'正在执行,所以我可以在我的控制器上捕获它并使用$ scope模糊输入$ on('hidePicker ',function(){ta​​rgetElement.blur()}'。这就解决了我的问题。 – vlasiak

0

智能而灵活的解决方案:检查open()方法中的$ event.target。

HTML:

<div class="my-datepicker" ng-click="datePickers.open(0, $event)"> 
    <input type="text" ng-model="date_min" uib-datepicker-popup is-open="datePickers.opened[0]"/> 
    <span class="glyphicon glyphicon-calendar"></span> 
</div> 
<div class="my-datepicker" ng-click="datePickers.open(1, $event)"> 
    <input type="text" ng-model="date_max" uib-datepicker-popup is-open="datePickers.opened[1]"/> 
    <span class="glyphicon glyphicon-calendar"></span> 
</div> 

JS:

$scope.datePickers = { 
    opened: [false, false], 

    open: function (i, e) { 
     if (!$(e.toElement).parent().hasClass('my-datepicker')) return; 
     this.opened[i] = true; 
    } 
}; 
+0

请考虑编辑你的帖子以添加更多关于你的代码的解释以及为什么它可以解决问题。即使它正在工作)通常不会帮助OP了解他们的问题。 – SuperBiasedMan