2014-02-09 126 views
0

我是新來的角和Javascript OOP一般。我希望構建一個可重用的角度組件,其中所有控件都可以綁定到一個JavaScript對象的實例。我遇到的一個奇怪的行爲是,試圖用JavaScript對象的方法過濾集合。我可以使用對象方法來過濾ng-repeat嗎?

我用簽名的方法filterVisible對象:

this.filterVisible = function(item) 

當我嘗試使用NG-重複該對象的方法方法過濾:

ng-repeat="item in item1.items | filter: item1.filterVisible" 

似乎不工作,但如果我在我的$範圍中的方法中包裝該對象的方法,如下所示:

$scope.filterVisible1 = function(item) { 
    return ($scope.item1.filterVisible(item)); 
} 

and chan我重複到:

ng-repeat="item in item1.items | filter: filterVisible1" 

它的工作原理。

這有點令人困惑,所以我把它放入plunker。有人可以解釋爲什麼過濾器的範圍方法的作品,但過濾器與對象方法不?

回答

1

正如你在文件中看到,http://docs.angularjs.org/api/ng.filter:filter

{{ filter_expression | filter:expression:comparator }} 

您可以使用表達filter,並且表達的是對所有屬性的評價是打擊範圍做評價,不像在JavaScript中,其中表達式將在文檔http://docs.angularjs.org/guide/expression中作爲deccirbe針對全局窗口進行評估。

因此,提高的問題是

item1.filterVisible在範圍界定?與filterVisible1是在範圍內定義的?

字符串「item1.filterVisible」可以用Javascript進行評估,但是它對於$ scope。$ eval()方法來說是不正確的表達式。

要確保您的表達能夠正常工作,請在點擊元素後在Chrome控制檯中運行以下代碼。

angular.element($0).scope().$eval(<your expression>) 

此外,我相信對象應該有有意義的方法名稱。在你的情況下filterVisible有點混淆。

- 編輯 -
它變成我們提供的代碼都在$ scope中定義。我發現有JS錯誤,這個錯誤可以被修復。

var _this = this; 
    this.filterVisible = function(item) { 
    return (Math.abs(_this.items.indexOf(item) - _this.selected_id) <= _this.limit); 
    } 
+0

我對你的回答有點困惑。 item1在$ scope中定義,並且它定義了一個filterVisible函數。你可以在我的plunker中看到它:http://run.plnkr.co/plunks/VuolUr/ – infomofo

+0

我的道歉,我猜你的代碼。你有JS錯誤。答案被編輯。 – allenhwkim

+0

啊,很好 - 我是js的新手,這件事情依然困擾着我。感謝您的幫助,它現在效果很好! – infomofo

相關問題