2017-01-30 2 views
1

Я немного почесываю голову, чтобы понять это правильно. Я чувствую, что я почти там, но не могу получить последний кусок, чтобы заставить его работать. Вот что я пытаюсь сделать. Я создаю настраиваемый фильтр, который будет проходить через мой json-массив, чтобы увидеть, есть ли ключ статуса, и если этот ключ статуса содержит поле «SUCCESS», он вернет весь объект, соответствующий этому массиву. Если ключевого слова «статус» нет, не показывайте объект массива. Я вижу, что мой цикл выглядит корректно, поскольку он выясняет, какой массив объектов содержит ключевое слово, но когда я пытаюсь распечатать мои результаты, я ничего не вижу. Пожалуйста помоги!Угловой пользовательский фильтр, который возвращает, если массив имеет соответствующую строку

Это демо.
https://jsfiddle.net/missggnyc/6r9oophu/20/

HTML

<div ng-app="mySessions"> 
    <div ng-controller="sessionController"> 
    <table> 
    <tr> 
     <td>Session ID</td> 
     <td>Session Name</td> 

    </tr> 
    <tr ng-repeat="cs in cSessions | successSessionFilter"> 
     <td>{{cs.id}}</td> 
     <td>{{cs.session_name}}</td>   
    </tr> 
    </table> 
</div> 

JS

var app = angular.module('mySessions', []); 
app.controller("sessionController", ['$scope', function($scope){ 
     $scope.cSessions = [ 
    {"id":2,"session_name":"BD20","session_description":"","status":["INPROGRESS"]}, 
    {"id":3,"session_name":"CS03","session_description":"","status":["INPROGRESS", "SUCCESS"]}, 
    {"id":4,"session_name":"MIS99","session_description":"","status":["FAIL","NOTINPROGRESS"]}, 
    {"id":5,"session_name":"XGY7","session_description":"","status":["SUCCESS", "NOTINPROGRESS"]}, 
     {"id":6,"session_name":"DCCC2","session_description":""}, 
     {"id":7,"session_name":"IUOS33","session_description":""} 
    ]; 
}]); 
app.filter('successSessionFilter', function(){ 
     return function(cObj){   
      angular.forEach(cObj, function(value, key){ 
       angular.forEach(value, function(v, k){ 
        //console.log('k is ' + k + ' and v is '+ v); 
        if(k === 'status'){ 
         if(v.indexOf("SUCCESS") > -1){ //if it exists 
          //console.log("SUCCESS exists "+ v.indexOf("SUCCESS")); 
          //console.log(v); 
          return true; 
         } 
         else { //it the status field isn't there, then don't show the object 
          return false; 
         }      
        } 
        else 
         return false; 
       })   
      }) 
    // console.log(cObj); 
     } 
    }); 

ответ

1

Здесь мы идем

app.filter('successSessionFilter', function(){ 
    return function(items){   
    var filtered = items.filter(function(item){ 
     if(item['status'] && item['status'].indexOf('SUCCESS') != -1){ 
     return item; 
     } 
    }) 
    return filtered; 
    } 
}); 

Demo https://jsfiddle.net/ogycjbkL/

+0

Вау .. Это то, что мне нужно делать. Спасибо за Ваш ответ. Ваш код на месте! – missgg

+0

приветствуется :) –

1

Простой способ. Просто измените тр нг-повтор в

<tr ng-repeat="cs in cSessions | filter:'SUCCESS'"> 
      <td>{{cs.id}}</td> 
      <td>{{cs.session_name}}</td>   
</tr> 

в действии: https://jsfiddle.net/hm4h2esj/

+0

что делать, если у вас есть «session_name»: «SUCCESS»? то это не работает –

+0

Я не думаю, что session_name будет УСПЕХОМ, как из заданного набора данных, имя_сезона является буквенно-цифровым. Ваш метод может выйти из строя, если имя ключа изменено. –

+0

Что делать, если массив состояния находился в пределах другого массива? Этот метод не будет работать в этом случае. Например, если данные были $ scope.cSessions = [ {"id": 2, "session_name": "BD20", "session_description": "", "status": {"mystatus": ["INPROGRESS", "SUCCESS «]}; – missgg