2017-06-01 75 views
0

我最好的嘗試找到解決方案已經空了。基本上,我想要做這樣的事情在我的html:AngularJS,在過濾器謂詞中訪問ngRepeat值

<div data-ng-repeat="tag in allTags"> 
    <h3>{{tag}}</h3> 
    <uib-accordion> 
    <div uib-accordion-group data-ng-repeat="item in displayItems | filter: tagFilter: tag"> 

tagFilter看起來是這樣的:

$scope.tagFilter = function(item, tag) { 
    if(item.tags.indexOf(tag) === -1) { 
     return false; 
    } 
    return true; 
    } 

在displayItems每一個項目是具有標籤的數組的對象,所以顯示的項目看起來是像這樣:

[ 
{ title: "Item 1 Title", body: "Some escaped HTML Content", tags: ["tag1", "tag2", "tag3"]}, 
{ title: "Item 2 Title", body: "Some escaped HTML Content", tags: ["tag2", "tag4"] } 
] 

我希望它出現在它所屬的所有標題下。問題是我無法弄清楚如何正確地將'tag'的值傳遞給tagFilter。在上面的代碼中,codeFilter中的參數標記無論如何都等於0。

回答

2

這裏的問題實際上是Filter語法的語義。更具體地說,上面使用的語法用於當您使用ngApp.filter(...)語法定義角度過濾器時...即,爲整個應用程序註冊並可在任何地方使用的過濾器。在這種情況下,過濾器語句中的第三個參數是要傳遞到註冊過濾器的值。

就你而言,你正在定義一個過濾器函數在你的控制器裏面,它改變了過濾器的工作方式。具體而言,您無法將動態值傳遞給控制器​​內的過濾器函數。當您使用功能爲filter表達,它具有以下特徵:

function(value, index, array) {}

,然後得到只是函數名堪稱filter語句,所以:

array|filter:filterfunction - 沒有PARAMS或括號。

value是被過濾的當前項目(在數組中)的值,index是該數組中項目的索引,而array是被過濾的整個數組。您不能爲此表達式「傳遞」一個值,但是如果適用,您可以使用控制器或範圍變量。在你的情況下,它並不是因爲你想要過濾的值在一箇中繼器內。

達到你想要什麼,你需要讓你的$scope.tagFilter成實際的角度濾波器,就像這樣:

ngApp.filter('tagFilter', function($filter) 
{ 
     return function(items, searchValue) 
     { 
      // initialize array to return 
      var filtered = []; 

      angular.forEach(items, function(obj) 
      { 
       // use filter to find matching tags (3rd param means EXACT search - set to False for wildcard match) 
       var objFilter = ($filter("filter")(obj.tags, searchValue, true))[0]; 

       // If a matching tag was found, add it to the filtered array 
       if (objFilter) filtered.push(obj); 
      }); 

      return filtered; 
     }; 
    }); 

上述假設您儲存angular.module(...)引導到一個名爲ngApp變量。一旦這個過濾器被註冊,你當前的過濾器語法應該按預期工作!

+0

不幸的是,它似乎沒有幫助,行爲與以前完全一樣 – whiplashomega

+0

然後需要查看更多的用例。如果「displayItems」是一個對象而不是一個數組,那麼它將不起作用 - 否則它應該。你可以發佈你的數據點的樣子嗎?也可能想嘗試將'tagFilter'和您的數據點分配給控制器變量,而不是使用$ scope。我個人從不再使用$ scope變量,只是因爲使用'ng-if'的細微差別和其他可能導致$ scope分配變量不可訪問的指令。 –

+0

增加了一個displayItems的例子(它最初是從服務器檢索到的JSON數據)。我通過開發工具進行了檢查,並且正在被正確引入和解釋。 – whiplashomega

0

假設displayItems是一個數組,

<div uib-accordion-group data-ng-repeat="item in displayItems.filter(tagFilter(tag))" > 

應該做的伎倆。

+0

這導致我的tagFilter函數中的'item'被傳遞給標籤的值,並且標籤被定義爲undefined。我試着改爲displayItems.filter(tagFilter(item,tag)),其後標籤正確且項目未定義。 – whiplashomega

0

想出一個辦法在此基礎上的博客文章要做到這一點:https://toddmotto.com/everything-about-custom-filters-in-angular-js/

基本上我不得不創建自己的自定義過濾器,而不是使用angulars謂詞過濾

的JavaScript:

ng.module('faq').filter(
    'tagFilter', function() { 
     return function(items, tag) { 
     return items.filter(function(item) { 
      if(item.tags.indexOf(tag) === -1) { 
      return false; 
      } 
      return true; 
     }); 
     } 
    } 
) 

HTML:

<div uib-accordion-group data-ng-repeat="item in displayItems | tagFilter: tag"> 

Still不知道爲什麼原始版本不工作,所以如果任何人都可以回答這10點給他們。