2017-10-15 12 views
0

カスタムフィルタを使用して複数の条件を1つの列にフィルタリングしました。コードはPlunkrで動作しますが、エディタから出力するときには使用しません

私はthis plunk

var app = angular.module('main', ['angular.filter']) 

    .filter('filterIns', function() { 

    var obj = {}; 

    return function(list, ins) { 

     var out = []; 

     for (var i = 0; i < list.length; i++) { 

     if (ins.indexOf(list[i].instrument) > -1) { 

      obj = list[i]; 
      out.push(obj); 
     } 
     } 
     if (ins.length === 0) { 
     out = list; 
     } 
     return out; 
    }; 

    }) 
    [...] 

をしたすべてが期待通りに働いています。しかし、このコードを私のlocalhost環境にコピーすると、11行目を参照すると、未定義のオブジェクト(評価された 'list.length') 'というエラーが発生します。

なぜ完全に動作しているのですか? Plunkrではlocalhostではなく?誰でも教えてもらえますか?

答えて

0

リストが非同期で読み込まれていますか?明らかに、フィルタが初めて実行されるときは未定義です。したがって、次のように11行目の前に条件を設定してください:

if (!list) { return []; } 
// or 
if (!list) { return undefined; } 
// or even better 
if (!list) { return list; } // this keeps things like 0, undefined or null intact 

あなたは安全でなければなりません。

+0

実際、私のリストは$ HTTPリクエストを介して非同期に読み込まれています。私のカスタムフィルターは、リストがロードされる前にロードされているようです。それは私が得るエラーを説明することができます。カスタムフィルタをロードする前にリストをロードすることは可能ですか? – Jojoseph

+0

条件の代わりに、リストに要素が含まれているかどうかを確認するif文を挿入しました。だから私はした:if(list){...残りのフィルタコード...} – Jojoseph

+0

あなたのデータは、そのデータ(フィルタ)をフィルタリングするコードの前に読み込まれて表示されることはありません...それはナンセンスです。防御的にプログラムを作成し、非同期操作を処理するときはデータが未定義であることを考慮に入れてください。 あなたは 'if(!list){return undefined;と同じことをしました。 } '。たぶん、もっと良いのは 'if(!list){return list; } ' – smajl

関連する問題