2014-09-01 3 views
1

Я совершенно новый с angularjs, поэтому я не уверен, что то, что я пытаюсь сделать, это правильный путь. В принципе, я хочу отображать на своей странице вложенный объект и фильтр, таким образом, пользователь может легко вводить ключевые слова на входе, а контент фильтруется, чтобы отображать только образы, найденные фильтром.angularjs фильтр на вложенных объектах

Однако я обратите внимание, что фильтр получает весь родительский объект, и я ожидал показать только запись, поэтому со следующим кодом, если я буду искать Японию, он отобразит Сидней, Мельбурн и Лос-Анджелес.

Javascript

<script type="text/javascript"> 
    var demoApp = angular.module('demoApp',['ngSanitize']); 
    demoApp.controller('simpleC',['$scope', function ($scope){ 
     $scope.info = [ 
     {name: 'Documents',links: [ 
       {linkname:'title1',linknamesublink:[ 
         {namesublink:'document 1', description: 'Sydney'}, 
         {namesublink:'document 2', description: 'Tokyo <b>Japan</b>'} 
         ]}, 
       {linkname:'title2',linknamesublink:[ 
         {namesublink:'document 3', description: 'Melbourne'}, 
         {namesublink:'document 4', description: 'Los Angeles'} 
         ]} 
       ]}, 
     {name: 'Video',links: [ 
       {linkname:'title1',linknamesublink:[ 
         {namesublink:'video 1', description: 'California'}, 
         {namesublink:'video 2', description: 'San Francisco <b> USA</b>'} 
         ]}, 
       {linkname:'title2',linknamesublink:[ 
         {namesublink:'video 3', description: 'South America'}, 
         {namesublink:'video 4', description: 'Northern <b>Europe</b>'} 
         ]}, 
       {linkname:'title3',linknamesublink:[ 
         {namesublink:'video name 5', description: 'Africa'}, 
         {namesublink:'video name 6', description: 'Bangkok <b>Thailand</b>'} 
         ]} 
       ]}, 
     ]; 
    }]); 
</script> 

HTML:

<div class="container" ng-app="demoApp"> 
    <br /><input type="text" class="form-control" ng-model="search" >   
    <div ng-controller="simpleC"> 
     <div ng-repeat="i in info | filter:search" > 
      {{i.name}} : 
      <div ng-repeat="link in i.links"> 
       {{link.linkname}} 
        <div ng-repeat="sublink in link.linknamesublink"> 
          {{sublink.namesublink}}: <!--{{sublink.description}}--> 
          <span ng-bind-html="sublink.description"></span> 
        </div> 
      </div> 
     </div>  
    </div> 
</div> 
+0

Вы пытаетесь достичь чего-то вроде автозаполнения? Вы можете использовать директиву 'typeahaed', объясненную по этой ссылке: http://angular-ui.github.io/bootstrap/ –

+0

Для человека, который голосует за этот вопрос (если он когда-нибудь вернется, чтобы прочитать его), можете ли вы предоставить причина для голосования вниз, и если это повторяющийся вопрос или слишком простой вопрос для вас, пожалуйста, предоставьте решение. – Manza

ответ

0

Написать свою собственную функцию фильтра. Таким образом, у вас есть полный контроль над тем, что возвращается. https://docs.angularjs.org/api/ng/filter/filter

module.filter('searchfilter', function() { 
    return function(searchexpr) { 
    var filteredList = ['my', 'filtered', 'result'];//implement yourself 
    return filteredList; 
    }; 
}); 

и использовать searchfilter вместо filter в разметке.

Или попробуйте использовать функцию фильтра, как описано здесь: http://fdietz.github.io/recipes-with-angular-js/common-user-interface-patterns/filtering-and-sorting-a-list.html (насколько я могу судить, вы не определили функцию поиска, то есть первое выражение для выражения фильтра).

+0

Я не уверен, насколько я понимаю эти примеры, поскольку, кажется, они жестко кодируют то, что они хотят фильтровать? – Manza

+0

Действительно, пример hardcodes возвращает значение (маленький комментарий дает подсказку :-)). Вам нужно перевернуть свою собственную функцию фильтра (т. Е. Прокрутить список и отфильтровать требуемые элементы). Это не слишком сложно и не имеет никакого отношения к угловым per se. – orange

+0

В соответствии с моим вторым предложением («Или, ...») вы можете определить функцию фильтра, которая решает, принимать или не принимать значение (аргумент 'search' в вашем примере - это * не * функция), но это выиграло Не работайте для своей структуры данных. – orange

0

Modified:

Если вы хотите, чтобы фильтровать объекты на основе любого поля (скажем, "имя"), вы можете использовать форму ниже

<div ng-repeat="i in info" ng-if="search==i.name"> 
+0

Привет, ну, я жестко считаю, что фильтр будет второй строкой на html: Manza

+0

Привет @ user668027, на основе которого в поле объект «информация», который вы хотите отфильтровать результат – Pavi

+0

Я обновил ответ. Если вам нужно отфильтровать его на основе любого другого поля, обновите его. Я постараюсь помочь – Pavi

2

Следуйте этому примеру

http://www.whatibroke.com/?p=857

Вы можете использовать фильтр в ng-repeat, чтобы фильтровать элементы по свойствам или написать фильтр самостоятельно.

Автор хочет фильтровать свойство почтового индекса на значение searc_postcode. Итак, он написал // фильтр {почтовый индекс: search_postcode} //

Пс. Извините, я неверно истолковал ваш вопрос.

+0

Привет, Спасибо за ответ, я попробовал, но он не работает , не уверен, что это потому, что я ищу вложенный объект? – Manza

+1

@ user668027 Да, это не работает с вложенными свойствами. Возможно, вам нужно создать собственный фильтр самостоятельно. https://docs.angularjs.org/tutorial/step_09 –

Смежные вопросы