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

наследование методов через директивные выражения

Я пытаюсь создать многоразовую директиву кнопки, которая имеет состояние «загрузки». То есть при щелчке он отключается и показывает встроенное изображение для обозначения загрузки, которое затем удаляется по завершении. Я делаю это, устанавливая переменную области действия в методе щелчка и сбрасывая ее, что изменяет состояние кнопки.

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

<loading-button class="login" data-ng-click="login()" text="Login" toggle="loaded"></loading-button>

Я надеялся сделать что-то вроде ниже, но как я могу связать метод щелчка, объявленный в экземпляре директивы, чтобы он действительно вызывался из директивы? Или это плохая практика? В настоящее время это не работает.

angular.module("App.directives").directive("loadingButton", function () {
return {
    restrict: "E",
    replace: true,
    transclude: true,
    template: '<button data-ng-click="{{ngClick}}">{{text}}<img class="loading" src="images/ButtonLoader.gif" alt=""></button>',
    scope: {
        "toggle": "=",
        "text": "=",
        "ng-disabled": "=",
        "disabled": "=",
        "ngClick": "&"
    },
    link: function(scope, element, attributes) {
        scope.text = attributes.text;
        var expression = attributes.toggle;

        scope.$watch(expression, function(newValue, oldValue) {
            if(newValue === oldValue) {
                return;
            }

            if(newValue) {
                element.removeAttr("disabled");
                element.find("img.loading").hide();
            }
            else {
                element.attr("disabled", "disabled");
                element.find("img.loading").show();
            }
        });
    }
  };
});

Используется так в родительской области:

$scope.login = function () {
    $scope.loaded = false;  // Disable button and show it loading

    // Do login stuff

    $scope.loaded = true; // Enable button and hide it loading
}

Изменить:

Вот скрипка

http://jsfiddle.net/jonathanwest/frvk6/2/

11.07.2013

  • кажется, есть некоторые проблемы с кодом, любезно настройте демонстрацию plunker или fiddle, чтобы проблему можно было исправить 11.07.2013
  • Следует ли вызывать ngClick? data-ng-click="{{ngClick()}}" 11.07.2013
  • Аджай — я же говорил выше, что код не работает, поэтому и пост. Я могу сделать демонстрацию скрипки, но она все равно не будет работать. 11.07.2013
  • rGil - боюсь, это не работает, и я не уверен, что это необходимо, поскольку метод передается как атрибут с уже присутствующими скобками? 11.07.2013
  • Просто добавил неработающую скрипку :-) 11.07.2013

Ответы:


1

EDIT — простейшее решение: если все, что вы делаете, — это включаете кнопку и скрываете элементы в этой кнопке, вам вообще не нужна директива:

<button ng-click="login()" ng-disabled="loading"><img ng-show="loading">Login</button>

В ПРОТИВНОМ СЛУЧАЕ, если вы хотите указать это в директиве:

Для начала вам не нужно {{}} в объявлении клика в шаблоне, и вам нужно вызвать ().

Я меняю ссылку на атрибут с ngClick на click — angular не понравится, что вы используете его имена в качестве своих атрибутов:

<button data-ng-click="click()">

И используйте ng-show и ng-disabled для кнопки и изображения.

<button ng-click="click()" ng-disabled="text==\'loading\'">
    <img ng-show="text==\'loading\'">{{text}}</button>

.

Для атрибута text, поскольку вы просто читаете значение строки, вам нужно изменить этот параметр области действия на text: "@".

Кроме того, поскольку toggle устанавливается в вашей области изолирования, вы можете просто $watch это непосредственно для изменений.

*Обратите внимание, что это всего лишь пример отключения и отображения элементов на основе области действия $watch. Для отключения и отображения могут потребоваться значения, прямо противоположные приведенным ниже, или они могут зависеть от другой переменной области видимости:

scope.$watch('toggle', function(newValue, oldValue) {
            if(newValue === oldValue) {
                return;
            }

            if(newValue) {
                scope.text = "loaded";
               ;
            }
            else {
                scope.text="loading";

            }
        });

.

Эта скрипта отражает рабочий пример, основанный на вашей настройке, с имитацией времени загрузки с использованием $timeout.

11.07.2013
  • Спасибо. Однако «текст» не установлен в области изоляции, он объявлен в экземпляре директивы. Кроме того, щелчок по-прежнему вызывает ошибку — см. jsfiddle.net/jonathanwest/frvk6/3. 11.07.2013
  • Тогда вам нужно "@". Также см. мой ответ для ng-click. Я бы не стал использовать имя «ng-click» в качестве атрибута. Обновленная скрипта 11.07.2013
  • Спасибо - я не думаю, что понял, что вы сказали должным образом! Нужно внести небольшое изменение, чтобы пройти через отключенное состояние, а в остальном - палец вверх! Спасибо еще раз. 11.07.2013
  • Новые материалы

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

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

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

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

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

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

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