Nano Hash - криптовалюты, майнинг, программирование

Scope eval возвращает undefined в директиве AngularJS

Предыстория: я пытаюсь запустить обратный вызов, когда что-то происходит внутри кода директивы в AngularJS.

Соответствующий код:

HTML:

<img-cropper onselect="updateAvatarData" x="100" y="100" src="{{tempAvatar}}" id="avatarCropper"/>

Контроллер:

$scope.updateAvatarData = function(c){
    alert("¡¡¡Funciona!!!!");
};

Директива:

<<more code up here>>

link: function(scope,element, attr) {
  scope.wsId = attr.id+'WS';
  scope.pvId = attr.id+'preview';
  scope.x = attr.x;
  scope.y = attr.y;
  scope.aspectRatio = scope.x/scope.y;
  scope.previewStyle = "width:"+scope.x+"px;height:"+scope.y+"px;overflow:hidden;";
  scope.onSelectFn = scope.$eval(attr.onselect);

<<more code down here>>

Проблема в последней строке «scope.onSelectFn = scope.$eval(attr.onselect);». Это "scope.$eval(attr.onselect);" возвращает «неопределенное». Attr.onselect работает нормально, он возвращает имя функции, введенное в атрибуте onselect.

Я сделал другие директивы с функциями, переданными через атрибуты, без проблем, но не могу найти, что я здесь делаю неправильно.

  • заранее спасибо

  • ты пробовал onselect="updateAvatarData()"? 06.06.2013
  • Да, я пытался. Не сработало. Спасибо, в любом случае. 07.06.2013

Ответы:


1

Почему вы делаете это, когда вы можете легко использовать функцию «&», доступную с angular

метод вызова родительского контроллера из директивы в AngularJS

Тем не менее, если вы хотите вызвать родительскую функцию таким образом, вам следует использовать $parse вместо eval, см. очень небольшой пример ниже при использовании

  link: function (scope,element,attrs) {
                   var parentGet = $parse(attrs['onselect']);

                   var fn = parentGet(scope.$parent);
                   fn();

               },
06.06.2013
  • Это дало мне: ReferenceError: $parse не определен. Я тоже посмотрю ссылку, которую вы мне дали. Спасибо. 07.06.2013
  • вам нужно ввести синтаксический анализ в определение директивы, тогда он не выдаст ошибку 07.06.2013
  • Хе-хе... конечно.... это сервис AngularJS. Это проснулось, но я не понимаю, почему это работало иначе в других директивах, которые я сделал. К сожалению, сейчас у меня нет времени на расследование. Спасибо еще раз. 07.06.2013

  • 2

    scope.$eval(attr.onselect) должно работать.

    Вот рабочая скрипта (протестирована в Chrome) с минимальной функцией ссылки:

    link: function(scope, element, attr) {
        scope.onSelectFn = scope.$eval(attr.onselect);
        console.log(attr.onselect, ',', scope.onSelectFn);
        scope.onSelectFn();
    },
    

    Единственное, что я могу придумать, так это то, что поскольку onselect является атрибутом HTML, возможно, это не работает в некоторых других браузерах. Поэтому, возможно, попробуйте использовать другое имя атрибута.

    07.06.2013

    3

    По умолчанию $eval оценивает данное выражение только в текущей области. Вы можете передать другой объект данных для оценки, и в вашем случае это родительская область. Вы должны называть это так:

    scope.onSelectFn = scope.$eval(attr.onselect, scope.$parent);
    

    См. документацию здесь

    29.03.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..