8

指定過濾對象變量我有使用過濾器這樣的ng-repeat在角JS

#1 
<div class="contestReports" ng-repeat="contest in contests | filter:{votingOver:true}"> 
    <contestreport></contestreport> 
</div> 

我想,讓客戶能夠過濾,所以我分配了過濾器的像這樣的變量:

#2 
<div ng-init="reportFilter = {votingOver:true}"></div> 
<div class="contestReports" ng-repeat="contest in contests | filter:reportFilter"> 
    <contestreport></contestreport> 
</div> 

代碼#1是工作,但代碼#2是不是和我不知道爲什麼。

+0

請看看這個http://plnkr.co/edit/nFFHmUA7RdxMIPV9VUDC?p=preview –

+0

這是通過plainte xt而不是對象過濾器 – Jordash

+0

一般來說ngInit並不是一個好的做法 - 無論如何 - https://docs.angularjs.org/api/ng/directive/ngInit,或者它更像是一個理論上的問題嗎? – shershen

回答

3

你也儘量包裹ng-init

<div ng-init="(reportFilter = '{votingOver:true}')"></div> 

然而,正如我在我的評論已經指出更早 - angularjs documentation狀態,使用ngInit大多在所有情況下,一個不好的做法。所以如果可能的話,這不應該是解決您的問題的方法。

而且你的#2代碼實際工作,請檢查該普拉克 - http://plnkr.co/edit/dBDyYPd3ZoUVdXngu52t?p=preview

//html 
    <div ng-init="reportFilter = {votingOver:false}"></div> 
<div class="contestReports" ng-repeat="contest in contests | filter:reportFilter"> 
    {{contest | json}} 
</div> 

    </div> 

//js in controller 
    $scope.contests = [ 
    {id:1, title:'1', votingOver:false}, 
    {id:2, title:'2', votingOver:true}, 
    {id:3, title:'3', votingOver:true} 
    ]; 
2

使用ng-init is not a good way to go with(正如你所看到的角文檔添加了警告文字爲紅色)。如您所知,它只會在初始渲染時進行評估(因爲ng-init會在preLink階段評估其表達式)。

通過查看您的代碼,看起來像reportFilter變量將成爲所有contests的共同對象。如我錯了請糾正我?

我會在控制器內添加一個像下面這樣的值。

//place this inside your controller 
$scope.reportFilter = { votingOver : true }; 

並直接使用視圖本身。

<div class="contestReports" ng-repeat="contest in contests | filter:reportFilter"> 
    <contestreport></contestreport> 
</div> 
1

更好的方法是,以節省NG-重複之前,在可變濾波器施加到JSON數據的結果在jsonArray像下面讀取的物品。

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app> 
 
    <div ng-init="contests= 
 
     [{name:'bad apple', votingOver:false}, 
 
     {name:'pleasurebuilder', votingOver:true}, 
 
     {votingOver:true}]"> 
 
    </div> 
 
    <div ng-init="reportFilter = {votingOver:true}"> 
 
    </div> 
 
    <div ng-repeat="contest in revoluza = (contests | filter: reportFilter)"> 
 
    {{contest}} 
 
    </div> 
 
    <hr> 
 
</div>

1

代碼2不工作,因爲你必須創建自定義過濾器,而你是唯一的intializing DIV不創建過濾器

碼1的工作,因爲你正在使用默認正確的語法過濾器,可以與任何對象進行比較,就像你做的一樣