2

我正在研究一个指令,该指令将基于 rootScope 变量禁用页面上的所有表单元素(类似于手动将 ng-disabled 添加到每个项目,但只是一种更方便的方式。我正在修改现有应用程序并不要不想挖掘一堆模板)

我需要能够连接多个 jqlite .find() 语句的结果。jqlite 似乎不支持像 .find('select,input') 这样的调用。我总是得到一个空数组。此外,由于它返回对象,我不能只是连接它们。我可能会从中得到一个面子,但我求助于你,StackOverflow。

var myApp = angular.module('myApp',[]);

myApp.directive('disableContents', function() {
    return {
        compile: function(tElem, tAttrs) {
            var inputs = tElem.find('input');
            var selects = tElem.find('select');

            var formItems = SOMETHINGTOJOINTHESTUFFABOVE
            angular.forEach(formItems, function(el){
...

继承人是我到目前为止想出的,但它让我有多个 foreach 语句。

'use strict';
angular.module('induction').directive('sttiDisabled', function() {
    return {
        compile: function(tElem, tAttrs) {
            var inputs = tElem.find('input');
            var selects = tElem.find('select');

            var applyDisable = function(el) {
                el = angular.element(el);
                var prevVal = el.attr('ng-disabled');
                prevVal = prevVal? prevVal +  ' || ': '';
                prevVal += tAttrs['sttiDisabled'];
                el.attr('ng-disabled', prevVal);
            }

            angular.forEach(inputs, function(el){
                applyDisable(el);
            });

            angular.forEach(selects, function(el){
                applyDisable(el);
            });


        }
    }
});
4

3 回答 3

1

要么我没有安静地理解这个问题,要么解决方案是:

var formItems = inputs.concat(selects);
于 2015-12-09T14:29:51.073 回答
1

如果您在 angular.js 文件之前引用了 jQuery,您将获得一个 jQuery 对象而不是 jQLite。还要记住 jQLite 是“仅限于按标签名称查找”。

于 2015-12-09T14:35:18.917 回答
1

jqLite( angular.element ) 确实不支持复杂的选择器,因此您必须首先使用querySelectorAll选择您需要的所有内容,然后使用angular.element实例包装此集合:

var formControls = angular.element(tElem[0].querySelectorAll('input, select'));
于 2015-12-09T14:37:40.503 回答