Я пытаюсь создать собственный фильтр в AngularJS, который будет фильтровать список объектов по значениям определенного свойства. В этом случае я хочу выполнить фильтрацию по свойству «полярность» (возможные значения «Положительный», «Нейтральный», «Отрицательный»).
Вот мой рабочий код без фильтра:
HTML:
<div class="total">
<h2 id="totalTitle"></h2>
<div>{{tweets.length}}</div>
<div id="totalPos">{{tweets.length|posFilter}}</div>
<div id="totalNeut">{{tweets.length|neutFilter}}</div>
<div id="totalNeg">{{tweets.length|negFilter}}</div>
</div>
Вот массив «$ scope.tweets» в формате JSON:
{{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"},
{created_at: "Date", text: "tweet text", user:{name: "user name", screen_name: "user screen name", profile_image_url: "profile pic"}, retweet_count: "retweet count", polarity: "Positive"}}
Лучший фильтр, который я мог придумать, выглядит следующим образом:
myAppModule.filter('posFilter', function(){
return function(tweets){
var polarity;
var posFilterArray = [];
angular.forEach(tweets, function(tweet){
polarity = tweet.polarity;
console.log(polarity);
if(polarity==='Positive'){
posFilterArray.push(tweet);
}
//console.log(polarity);
});
return posFilterArray;
};
});
Этот метод возвращает пустой массив. И ничего не печатается из заявления "console.log (полярность)". Похоже, я не вставляю правильные параметры для доступа к свойству объекта «полярность».
Любые идеи? Ваш ответ очень признателен.
javascript
angularjs
sh3nan1gans
источник
источник
Ответы:
Вам просто нужно использовать
filter
фильтр (см. Документацию ):<div id="totalPos">{{(tweets | filter:{polarity:'Positive'}).length}}</div> <div id="totalNeut">{{(tweets | filter:{polarity:'Neutral'}).length}}</div> <div id="totalNeg">{{(tweets | filter:{polarity:'Negative'}).length}}</div>
Fiddle
источник
filter:{polarity:polarityToFilter}
где$scope.polarityToFilter
заполняется щелчком по одной из трех кнопок. Это то, что вы пытаетесь сделать?$index
свойство в локальной области видимости, которое вы также можете использовать.В документации есть полный ответ. Во всяком случае, как это делается:
<input type="text" ng-model="filterValue"> <li ng-repeat="i in data | filter:{age:filterValue}:true"> {{i | json }}</li>
будет фильтровать только
age
вdata
массиве иtrue
для точного совпадения.Для глубокой фильтрации,
<li ng-repeat="i in data | filter:{$:filterValue}:true"> {{i}}</li>
Это
$
специальное свойство для глубокого фильтра иtrue
для точного совпадения, как указано выше.источник
Вы также можете сделать это, чтобы сделать его более динамичным.
<input name="filterByPolarity" data-ng-model="text.polarity"/>
Тогда ваш ng-repeat будет выглядеть так
<div class="tweet" data-ng-repeat="tweet in tweets | filter:text"></div>
Этот фильтр, конечно, будет использоваться только для фильтрации по полярности.
источник
У нас есть коллекция, как показано ниже:
Синтаксис:
{{(Collection/array/list | filter:{Value : (object value)})[0].KeyName}}
Пример:
{{(Collectionstatus | filter:{Value:dt.Status})[0].KeyName}}
-ИЛИ-
Синтаксис:
ng-bind="(input | filter)"
Пример:
ng-bind="(Collectionstatus | filter:{Value:dt.Status})[0].KeyName"
источник
Вы можете попробовать это. его рабочее для меня "имя" - собственность в обр.
repeat="item in (tagWordOptions | filter:{ name: $select.search } ) track by $index
источник