gpt4 book ai didi

javascript - 如何编写通过选择器切换类的 Angular Directive(指令)

转载 作者:可可西里 更新时间:2023-11-01 02:09:18 25 4
gpt4 key购买 nike

我正在尝试编写一个根据选择器条件切换类的指令:

<label class-when="{'is-checked': ':has(input:checked)', 'is-disabled': ':has(input:disabled)'}">
<input type="checkbox">
Example checkbox
</label>

我需要以某种方式监视元素及其后代上的 DOM 更改,但我得到了 ng:areq error .我该怎么做?

define(function (require) {
var _ = require('lodash');

return {
restrict: 'A',
scope: {
object: '@classWhen'
},
link: function (scope, element) {
scope.$watchCollection(function() {
return element.find('*').add(element);
}, function () {
_.forOwn(scope.object, function (test, classes) {
test = typeof test === 'boolean' ? test : element.is(test);
element.toggleClass(classes, test);
});
});
}
};
});

最佳答案

好的,在阅读了您的悬赏评论后,我了解到您希望它独立于 Controller 。我花了一些时间彻底修改我的解决方案,我想我终于找到了一种方法来完成你想要的。

它实际上归结为两件事:

1) 检测复选框 :checked 状态的变化,以及

2) 检测复选框 :disabled 状态的变化

检测 1) 很容易,因为您可以使用简单的 jQuery 更改处理程序,但检测 2) 需要更多研究。它需要在子 ng-disabled 属性上使用 scope.$watch

这是一个如何工作的演示:

var app = angular.module("myApp", [])
.directive("classWhen", function() {
function setClasses(classWhen, $element, $input) {
Object.keys(classWhen).forEach(function(key) {
var test = classWhen[key];
// .toggleClass("className", true) === .addClass("className")
// .toggleClass("className", false) === .removeClass("className")
$element.toggleClass(key, $element.is(test));
});
}
return {
restrict: 'A',
link: function link (scope, element, attrs) {
var classWhen = JSON.parse(attrs.classWhen);
var $element = $(element);
$element.find("*").each(function (index, elem) {
var $elem = $(this);
// namespace the change event so we can easily .off() it
$elem.off("change.classWhen");
$elem.on("change.classWhen", function () {
setClasses(classWhen, $element, $elem);
});
// watch child ng-disabled attribute
scope.$watch($elem.attr("ng-disabled"), function (val) {
setClasses(classWhen, $element, $elem);
});
});
}
};
});
.is-checked {
background-color: yellow;
}
.is-disabled {
background-color: lightblue;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div ng-app="myApp">
<label>
<input type="checkbox" ng-model="disableAll" />Disable All</label>
<br>
<br>
<label class-when='{"is-checked": ":has(input:checked)", "is-disabled": ":has(input:disabled)"}'>
<input type="checkbox" ng-disabled="disableAll">Example checkbox 1
</label>
<br>
<label class-when='{"is-checked": ":has(input:checked)", "is-disabled": ":has(input:disabled)"}'>
<input type="checkbox" ng-disabled="disableAll">Example checkbox 2
</label>
<br>
<label class-when='{"is-checked": ":has(input:checked, .test)", "is-disabled": ":has(input:disabled)"}'>
<input type="text" ng-disabled="disableAll" ng-class="testingClass" ng-model="testingClass"/>
<br>
<input type="checkbox" ng-disabled="disableAll">
Example checkbox 3
</label>
<br>
<label class-when='{"is-checked": ":has(input:checked)", "is-disabled": ":has(input:disabled)"}'>
<input type="checkbox" ng-disabled="disableAll">Example checkbox 4
</label>
</div>

关于javascript - 如何编写通过选择器切换类的 Angular Directive(指令),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39905404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com