Angularjs 触发时绑定到日期选择器事件

Angularjs 触发时绑定到日期选择器事件,angularjs,angular-strap,Angularjs,Angular Strap,我使用的是angular strap日期选择器,我想在日期选择器打开和关闭时执行一些我自己的逻辑 如何识别控制器中的这些事件并绑定到它们 不仅仅是datepicker事件,还有任何与此相关的事件 我想做的一个例子: 我检查了AngularStrap的日期选择器的代码。他们提供了一个$datepicker服务,我认为可以对其进行修饰以实现您想要的功能,但这应该在应用程序的config阶段完成,该服务需要初始化DOM元素。因此,我认为这个解决办法是不可行的 总之,我看了一下,它提供了用于指定open

我使用的是angular strap日期选择器,我想在日期选择器打开和关闭时执行一些我自己的逻辑

如何识别控制器中的这些事件并绑定到它们

不仅仅是datepicker事件,还有任何与此相关的事件

我想做的一个例子:


我检查了AngularStrap的日期选择器的代码。他们提供了一个
$datepicker
服务,我认为可以对其进行修饰以实现您想要的功能,但这应该在应用程序的
config
阶段完成,该服务需要初始化DOM元素。因此,我认为这个解决办法是不可行的


总之,我看了一下,它提供了用于指定
open
close
事件的函数。使用它们并在那里发出事件将更容易。

假设您希望在控制器中获取所选日期并对其进行处理:

将此添加到控制器:

$rootScope.$watch('datepickerDateSelected', function(date){
    // do whatever you want with the date parameter here
});
并修改datepicker指令$scope.select方法,如下所示:

scope.$select = function (date) {
    $rootScope.datepickerDateSelected = date; // ADD THIS
    $datepicker.select(date);
};
$datepicker.show = function(){
    ...
    $rootScope.$broadcast('opening'); // ADD THIS
    ...
}

 $datepicker.hide= function(blur){
    ...
    $rootScope.$broadcast('closing'); // ADD THIS
    ...
}
[更新]

使用$broadcast/$on。修改指令($datepicker.show和$datepicker.hide方法),如下所示:

scope.$select = function (date) {
    $rootScope.datepickerDateSelected = date; // ADD THIS
    $datepicker.select(date);
};
$datepicker.show = function(){
    ...
    $rootScope.$broadcast('opening'); // ADD THIS
    ...
}

 $datepicker.hide= function(blur){
    ...
    $rootScope.$broadcast('closing'); // ADD THIS
    ...
}
在控制器中,添加以下内容(无需观看任何内容):

在我的案例中,它是有效的,但您可能想检查一下:(参见zbynour的答案)


如果您不想使用$broadcast/$on(参见注释),只需像第一个示例中那样使用$watch即可。

您可以向JSFIDLE/plunkr提供您所拥有的,以便其他用户可以在此基础上进行构建,并向您展示如何实现您想要的ng更改?谢谢,但我无法找到“属性化以指定用于打开和关闭事件的函数“你能给我一个如何做的例子吗?看看他们提供的例子,特别是在弹出日期选择器。在第25行,它们将一个按钮绑定到控制器作用域中声明的
open
函数。该函数更改
opened
变量的值,该变量控制日期选择器是否打开/关闭。你可以观察这个变量来执行你的自定义逻辑。我刚刚意识到你说的是AngularUI,我必须找到AngularStrapi的解决方案。恐怕AngularStrap没有简单的解决方案,除非你自己修改代码。为什么你不能创建一个自定义的AngularStrap构建来排除DatePicker模块,并使用AngularUI的DatePicker?是的,这是一个解决办法。现在我想了想,您还可以
$emit
一个
datePickerDateSelected
事件,将
日期
也作为一个值传递,并使用
$on
在您想要使用所选日期的任何地方监听该事件。这样可以避免在“`$rootScope`上创建属性。无论如何,差异非常小。除了OP希望对
打开
关闭
事件做出反应之外,而不是对
日期选择
事件做出反应……OOOP。你完全正确,@link。但是,我只想给出一个示例,说明如何监视变量并在指令中更改它。无论如何,该指令确实有$datepicker.show和$datepicker.hide方法-尽管它们都在用户打开/关闭日历时执行,但我确信可以对其执行一些操作。PS:我也喜欢$emit事件的可能性,尽管它似乎有一些警告:可能是$rootScope。$broadcast(someEvent)和$on(someEvent)也会起作用:如果您使用
$rootScope
作为事件总线(也就是说,您从
$rootScope
发出
$emit
,并通过
$rootScope
上的
$on
进行监听)然后,
$emit
这比
$broadcast
好。广播会使事件在作用域中冒泡,从而导致性能损失。从rootScope发出事件保证只有rootScope本身可以对其作出反应,并且在这种情况下效率更高