2015-04-23 4 views
0

Я пытаюсь добавить несколько функций из jQuery в jqLite, так что мне не нужно загружать всю библиотеку jQuery с помощью моих угловых приложений. Я использую технику, используемую Ben Nadel в этой статье.Угловой узел JS и jqLite для селектора

http://www.bennadel.com/blog/2753-creating-jqlite-plugins-in-angularjs.htm

Я бегу в сложности реализации closestChild плагин, как этот.

https://github.com/lolmaus/jquery.closestchild/blob/master/jquery.closestchild.js

Очевидно, я переписаны немного, так это выглядит.

JQLite.prototype.closestChild = function(selector) { 

      var $children, $results; 

      $children = this.children(); 

      if ($children.length === 0){ 
       return $(); 
      } 

      $results = $children.filter(selector); 

      if ($results.length > 0){ 
       return $results; 
      } 
      else{ 
       return $children.closestChild(selector); 
      } 

     }; 

... но это приводит к этой ошибке.

Error: [jqLite:nosel] http://errors.angularjs.org/1.4.0-rc.0/jqLite/nosel 

Таким образом, я сделал поиск ошибки и обнаружил, что jqLite не может сравниться с селекторов по какой-то причине, только имена тегов (это когда-нибудь полезным?). Я не могу понять, что он работает вместе с функцией Ben's .filter() из этой статьи, которая, кажется, работает нормально, когда вы даете ей селектор. Это то же самое, что я вызываю в этой строке.

$results = $children.filter(selector); 

Так что, я думаю, мой вопрос, есть ли способ, что я могу Проходной $ дети и посмотреть, если любой из них соответствует селектору, который передается при помощи обычный JavaScript, или какой-либо другой обходного путем?

ответ

1

Я не уверен, что вы ожидаете от «селектора», но селектор (как следует из кода Бена Наделя) является либо обратным вызовом, либо узлом DOM.

Так было бы бы

angular.element(document.body) 
.find('div') 
.closestChild(function(el) { 
    var element = angular.element(el); 
    console.log(element); 
    return !!element.text(); 
}); 

поддержка jqLite в селекторах точно так же, как и ручные состояния: он делает только getElementsByTagName и только на find.

Для реализации «более тяжелых» jqLite вы можете проверить проекты this и that (они совершенно новые, я еще не пробовал их в работе, поэтому не стесняйтесь делиться своими впечатлениями).

+0

Это блестящий эст, спасает меня, плавая вокруг моей глубины, пытаясь переписать jqLite. Я испытываю соблазн пойти со вторым, потому что он самый маленький, но что-то говорит мне, что для нескольких дополнительных Kb, имеющих доступ к некоторым дополнительным вещам, например .closest(), может быть очень удобно, и он все еще намного меньше, чем jQuery. Еще раз спасибо. – jonhobbs

+0

Надеюсь, что они достаточно хороши. Я собирался включить jqLite с Sizzle не так давно, пока не открыл их. – estus