2016-11-25 76 views
0

下面是beforeEach功能輸入:不使用(類型=「複選框」]) - 在角度測試不工作

template = '<form name="configForm">' + 
        '<input type="number"/>' + 
        '<input type="checkbox"/>' + 
        '<input type="text"/>' + 
        '<div class="form-error" ng-show="configForm.$error.max">Error</div>' + 
        '</form>'; 
element = angular.element(template); 
element = $compile(element)($scope); 

我編譯模板爲什麼在下面找到方法返回我空的結果嗎?

var dirElementInput = element.find('input:not([type="checkbox"])'); 
console.log(dirElementInput); 
console.log(dirElementInput.length); 

但是當我使用它像這樣,它的工作原理:

var dirElementInput = element.find('input'); 
console.log(dirElementInput); 
console.log(dirElementInput.length); 

Object{0: <input type="number">, 1: <input type="checkbox">, 2: <input type="text">, length: 3} 

LOG: 3 

回答

1

的jQueryLite即角用途,該find()方法是限制爲標籤名找到,所以你不能使用:not這裏就像你在完整的jQuery庫中一樣......

另一種方法是編寫一個小方法來過濾輸入類型。

僅供參考,這裏是find()上的Angular Documentation

1

AngularJs使用jQlite進行DOM操作,這是jQuery DOM操作庫的輕量級實現。問題是,jQlite不支持這些複雜的選擇,根據docs

find() - 通過標籤名稱限制爲查找

angular.element - 請記住,此功能將無法找到被標記元素名稱/ CSS選擇器。對於通過標籤名稱查找,請嘗試改爲angular.element(document).find(...)$document.find(),或使用標準DOM API,例如document.querySelectorAll()

因此,如果你想使用複雜的選擇器,你可以使用jQuery代替,或使用documento.querySelector()

對於通過jQuery替代jQlite使用AngularJs,您可以使用ngJq指令,這種方式將使用window.jQuery而不是其內部的jQlite。

<!doctype html> 
<html ng-app ng-jq="jQuery"> 
... 
... 
</html> 

或者在最後一種情況下,你總是可以回退到的javascript:

var inputs = angular.element(document).find('input'); 

var nonCheckBoxArray = [].filter.call(elements, function(elm) { 
    return elm.type != 'checkbox'; 
}); 

var inputsNonCheckBox = angular.element(nonCheckBoxArray);