Как выставить пользовательские функции на выражения angularjs

0

У меня есть функция 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>
  • 1
    вам нужно назначить inArray () для $ scope
  • 0
    thnx @jrath, однако у меня есть проблема с этим ответом, хотя, пожалуйста, смотрите ответ matthiasgiger ниже
Теги:

2 ответа

0
Лучший ответ

Используйте фильтры для повторного использования кода. Прикрепление его к области или 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>

Тем не менее, вы, вероятно, захотите изменить порядок параметров сена и иглы, чтобы лучше подойти к идиоме.

  • 0
    я не уверен, что полностью следую здесь, как фильтр inArray передается в выражение?
  • 0
    Он передается путем регистрации его в качестве фильтра в контейнере Angular Inversion of Control. Любой фильтр доступен в любом выражении.
Показать ещё 3 комментария
0

Решение состоит в том, чтобы добавить его в Угловую область:

$scope.inArray = function( needle, haystack, assocKey ){ .. }

Таким образом, Angular будет знать функцию inArray.

Все, что находится в объекте $ scope, можно получить непосредственно из HTML-кода.

  • 0
    Да, но в этом случае у меня есть частичная переработка во многих частях приложения, в настоящее время в 6 местах, с использованием 3 разных контроллеров. Кажется, довольно многословно добавлять эту функцию в каждый контроллер. Можно ли как-то добавить это в глобальную область где-нибудь?
  • 1
    @John использует $ rootScope вместо $ scope, чтобы он был глобальным (или, может быть, вы можете использовать сервис: docs.angularjs.org/guide/services )
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню