【问题标题】:How does one concat the results of angularjs jqlite find?如何连接 angularjs jqlite 的结果?
【发布时间】:2016-03-14 20:50:30
【问题描述】:

我正在研究一个指令,该指令将基于 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);
            });


        }
    }
});

【问题讨论】:

    标签: javascript angularjs concat jqlite


    【解决方案1】:

    jqLite (angular.element) 确实不支持复杂的选择器,所以你必须先用querySelectorAll 选择你需要的所有东西,然后用angular.element 实例包装这个集合:

    var formControls = angular.element(tElem[0].querySelectorAll('input, select'));
    

    【讨论】:

      【解决方案2】:

      要么我没听懂这个问题,要么解决办法是:

      var formItems = inputs.concat(selects);
      

      【讨论】:

      • 我无法连接对象数组。它不是输入对象的函数 .find() 返回一个对象数组,尽管它几乎完全像一个正常的项目数组。输入[0] 和输入[1] 都有效,但它返回属性1 和属性2,每个都是找到的元素之一。令人沮丧。
      • 是的,你没有理解这个问题。 inputs 不是数组,所以没有 concat 方法。
      【解决方案3】:

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

      【讨论】:

      • Angular + Raw jQuery?你怎么敢!除了开玩笑,我受到项目负责人的限制,不能这样做。必须是仅 Angular 或仅 javascript 解决方案。不过谢谢,这是一种有趣的方法。
      • 哈哈。是的,让我们扼杀关于 Angular js 的好处之一,回到样板 javascript DOM 操作......
      • 我知道足够危险
      猜你喜欢
      • 2013-11-13
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多