2016-11-04 18 views
1

変数の束をフィルターに渡す必要があるので、モデル全体を渡す方が簡単だと思いました。私は次のエラーを取得していますがフィルタでモデルを使用するにはどうすればよいですか?

app.filter('applyLimit', function() { 
    return function(files, m) { 
    return files.map(function(v,i){ 
     v.analyze = i < m.limit 
     return v 
    }) 
    } 
}); 

angular.module("app").component("h2jcomponent", { 
    templateUrl: "html/View.html", 
    controllerAs: "m", 
    controller: ['$filter', H2J_Controller] 
}); 

function H2J_Controller($filter) { 
    var m = this 
    m.limit = 1 
    var files = [{name:'foo.java',analyze:true},{name:'bar.java',analyze:true}] 
    $filter('applyLimit')(files,m) 
} 

TypeError: Cannot read property 'limit' of undefined

私は私を渡すことができないためであると仮定していますので、私はこれを(これは簡易版である)実行しようとしましたフィルタ全体をモデル化していますが、わかりません。これは可能ですか?

+1

このプランナーで問題を再現してみてください:https://plnkr.co/edit/0TYC56eNLSugPp8tDFeH?p=preview – Andriy

+1

はい私もゲットしていませんTypeError:未定義のプロパティ 'limit'を読み取ることができない – user3249448

+0

近い将来の可能性のある解決策はこちら[http://stackoverflow.com/a/17813797/4593781] –

答えて

1

最初のフィルタの引数は、任意の任意の付加的配列(私たちの場合はファイル)を処理し、それの後にする必要があります議論(制限私達の場合)。

app.filter('applyLimit', function() { 
    return function(files, scope) { 
    return files.map(function(v, i){ 
     v.analyze = i < scope.limit; 
     return v; 
    }) 
    } 
}); 

: この方法では、私たちのフィルタが

<pre>{{ vm.files2 | applyLimit : vm | json }}</pre> 

ような中括弧内のNGリピートng-repeat="file in vm.files | vm.applyLimit : vm")または単に角度の表現のようなディレクティブとHTMLで使用することができるので、私はにフィルタを書き直し更新されたプランナー:https://plnkr.co/edit/0TYC56eNLSugPp8tDFeH?p=preview

+0

私はこのモデルでは、(この例ではすべてが必要ですが)制限するのではなく、渡したいと思います。私は(ファイル、m)を渡すとうまくいかず、私が(m、ファイル)を渡すとうまくいくのはなぜですか? –

+1

あなたのplunker(https://plnkr.co/edit/el6yb3xRnkw4sku1kjEm?p=preview)はうまくいきます。あなたのapp.jsに 'm.files = angular.copy(files);'を追加するだけです(例えば13行目) 。あなたが合格すると動作します(ファイル、m)。私はプランナーを更新し、モデルを受け取るように答えました。 – Andriy

0

私がなぜわからないんだけど、のparamsの順序を変更すると、それを固定:

app.filter('applyLimit', function() { 
    return function(m, files) {   // <---- changed from (files,m) to (m,files) 
    return files.map(function(v,i){ 
     v.analyze = i < m.limit 
     return v 
    }) 
    } 
}); 

angular.module("app").component("h2jcomponent", { 
    templateUrl: "html/View.html", 
    controllerAs: "m", 
    controller: ['$filter', H2J_Controller] 
}); 

function H2J_Controller($filter) { 
    var m = this 
    m.limit = 1 
    var files = [{name:'foo.java',analyze:true},{name:'bar.java',analyze:true}] 
    $filter('applyLimit')(m,files)  // <---- also here 
}