角度自定义指令-$scope$注意不要开火
Angular custom directive - $scope.$watch not firing
我正在尝试制作一个下拉指令,使用Angular UI代码来获得灵感。
我可以让它在打开和关闭下拉列表的意义上工作,但我已经尝试扩展它,以便"dropdownManager"服务可以关闭页面上的所有下拉列表,并且可以使用页面控制器代码打开和关闭它。
为了做到这一点,我创建了一个名为"is open"的属性,并在上面放置了一个角度手表。不幸的是,当控制器更新属性时,或者当从指令自己的打开/关闭函数更新范围变量时,这个手表不会启动。我知道这个值在变化,因为否则下拉列表就不会打开和关闭,但手表肯定不会出现,因为我在里面有一个console.log。
奇怪的是,当它第一次初始化时,它确实为页面上的每个下拉列表触发一次,因为console.log被写入了!
无论如何,我尝试了一下,但有太多的依赖项,对不起,但我已经设法尽可能减少代码,所以希望经验丰富的Angular用户应该很容易理解。
angular.module('directives').directive('dropdown', function () {
return {
restrict: 'EA',
scope: {
isOpen: '=?',
},
link: function ($scope, $element, $attrs, ngModel) {
// Defaults
$scope.isOpen = false;
// Watch the isOpen variable
$scope.$watch('isOpen', function(value) {
console.log("Scope Changed", $scope.isOpen);
// Open or close this panel
if (value === true){
$scope.openDropdown();
}
else{
$scope.closeDropdown();
}
});
// Open Dropdown
$scope.openDropdown = function($event){
$scope.isOpen = true;
var panelEl = $element.find('[dropdown-panel]');
panelEl.slideDown(100, function(){
$element.addClass('is-open');
});
};
// Open Dropdown
$scope.closeDropdown = function($event){
$scope.isOpen = false;
var panelEl = $element.find('[dropdown-panel]');
$element.removeClass('is-open');
panelEl.slideUp(100);
};
// Toggle Dropdown
$scope.toggleDropdown = function ($event) {
if(!$scope.isOpen){
$scope.openDropdown();
}
else{
$scope.closeDropdown();
}
};
// Add click event to toggle element
$element.find('[dropdown-toggle]').bind('click', $scope.toggleDropdown);
}
};
});
一次关闭和打开所有下拉列表的好方法是使用事件:
$scope.$on('close all modals', function(){
$scope.isOpen = false;
})
$scope.$on('open all modals', function(){
$scope.isOpen = true;
})
然后当你想关闭所有东西时,在代码中的任何地方你都可以调用:
$rootScope.$broadcast('close all modals');
您的手表被调用一次的原因可能是isOpen从undefined变为false。我认为你的问题是isOpen是在不同的范围内定义的。
好的,所以我最终自己找到了答案。
此:
$element.find('[dropdown-toggle]').bind('click', $scope.toggleDropdown);
需要成为:
$element.find('[dropdown-toggle]').bind('click', function(){
$scope.$apply($scope.toggleDropdown);
});
我认为这是因为jQuery点击事件发生在"Angular世界之外",所以将其封装在应用程序中会导致在点击后发生摘要循环,然后触发手表。
不过,不要相信我的话。我在说文字,但我真的不知道它们是什么意思。
相关文章:
- AngularJS:ng之后,重复$scope值未按预期更新
- $ionicplatform内的$scope不;不起作用
- 使用$scope方法时的ControllerAs语法
- 如何将ngrepeat下的ngmodel绑定到$scope
- 另一个if(!$scope.$$phase)$scope$apply()szenario-需要帮助才能通关
- 使用AngularJS Directive WHITOUT$scope创建一个动态html元素
- $scope变量被视为字符串AngularJs
- 点击不'似乎没有开火
- ng在更新$scope后重复不更新信息
- 正在获取Angular以检测$scope中的更改
- 如何惯用地手动销毁scope&在AngularJS中重新创建
- Understanding Javascript scope with "var that = this&qu
- AngularJS,angular.element($0).scope()揭示了每个控制器的函数
- Ng出口无法访问父$scope
- ng选项-用vm替换$scope
- $scope变量,ng隐藏/显示
- 强制 $scope.$watch 只开火一次
- 角度自定义指令-$scope$注意不要开火
- $scope$手表没有'当我根据指令更新时,不要开火
- 在$scope内不开火,$watch