У меня есть функция inArray, которую я хотел бы/должен был бы выставить для угловых значений:
Функция
function inArray( needle, haystack, assocKey ){
assocKey = assocKey || false;
for(var i=0;i<haystack.length;++i){
if( assocKey ){
if( haystack[i][assocKey] == needle ){
return true;
}
} else if( haystack[i] == needle ){
return true;
}
}
return false;
}
Указанный html
<div ng-show="inArray(currentUser.id, item.comments, 'commenter_id')">
You have commented on this already.
</div>
Если примером упрощенного элемента будет:
item = {
post: 'sfdcsdvsdv',
images: ['1.png','2.png'],
date: 'some date',
comments:[{
commenter_id: 321654987,
comment: 'sdfvsdvsdfv',
date: 'some other date'
},{
commenter_id: 65498721,
comment: 'ptyopoinmu',
date: 'some other date'
}]
}
Этот код даже не касается функции inArray, которую я создал в глобальном пространстве имен.
Я предполагаю, что это для безопасности, то есть предотвращения плохого html, выполняющего изворотливые функции, которые пользователь не хочет запускать, но есть ли способ разрешить функции набора?
Рабочий ответ Используя ответ @Martin ниже, я смог собрать рабочее решение:
Фильтр
angular.module('myApp').filter('inArray', function() { // register new filter
return function( input, needle, assocKey ){ // filter arguments
return inArray( input, needle, assocKey ); // implementation
}
});
Html
<div ng-show="item.comments | inArray:currentUser.id:'commenter_id'">
You have already commented on this
</div>
Используйте фильтры для повторного использования кода. Прикрепление его к области или rootScope - плохой запах. С вашей функцией в вашем примере вы можете сделать
angular.module('app').filter('inArray', function() { return inArray });
Тогда, на ваш взгляд
<div ng-show="currentUser.id | inArray : item.comments : 'commenter_id'">
You have commented on this already.
</div>
Тем не менее, вы, вероятно, захотите изменить порядок параметров сена и иглы, чтобы лучше подойти к идиоме.
Решение состоит в том, чтобы добавить его в Угловую область:
$scope.inArray = function( needle, haystack, assocKey ){ .. }
Таким образом, Angular будет знать функцию inArray.
Все, что находится в объекте $ scope, можно получить непосредственно из HTML-кода.