Uncaught ReferenceError: <функция> не определена - тег InnerHTML <script> с угловым

У меня есть компонент в Angular, содержимое которого предоставляется серверной частью, предоставляющей HTML-код. Я добавляю его в компонент как внутренний HTML. В предоставленном HTML есть теги и теги. Однако, хотя я думаю, что стили соблюдаются, я не могу вызвать функцию в теге скрипта.

Тег <script>:

  function ToggleDisplayMode(node) 
    {
        var tableHeader = document.getElementById(node);
        if (null != tableHeader)
        {
            var row = tableHeader.nextSibling;
            while (row != null)
            {
                if ( row.style.display != "none" ) {
                    row.style.display = "none";
                }
                else {
                    row.style.display = "";
                }
                row = row.nextSibling;
            }
        }
    }

Как я вызываю эту функцию:

<a onclick = "ToggleDisplayMode(<args>)"><u>show/hide</u></a>

Щелчок не работает, и в консоли появляется следующий вывод:

> Uncaught ReferenceError: ToggleDisplayMode is not defined
>     at HTMLAnchorElement.onclick (<args>)

Функция четко определена, поэтому я не понимаю, что я здесь делаю не так.

Я проверил несколько сообщений по этой проблеме, но они основаны на JQuery. Это проблема того, как Angular может обрабатывать внутренний HTML?

Обновлено: Щелчок должен обрабатываться JavaScript, а не Angular (из-за особенностей этой системы), поэтому ngClick или (click) не будут работать.

Обновлено еще раз: Очевидно, теги <script> в innerHtml не выполняются согласно эта почта. Тогда придется найти другой способ сделать это.

какую версию angular вы используете? а что здесь <args>?

Aagam Jain 24.10.2018 15:56

Это дизайнерская особенность, но этот HTML-код предоставляется имеющимся у нас SDK, а приложение angular было создано на его основе позже. Тот же HTML используется в ряде других клиентских интерфейсов, поэтому я не могу вносить в него изменения. Поэтому я не могу использовать ngClick

naman1901 24.10.2018 15:57

На данный момент Angular 4, а <args> - это в основном идентификатор узла в HTML. См. var tableHeader = document.getElementById(node); во второй строке функции.

naman1901 24.10.2018 15:57

Если вы откроете консоль и наберете ToggleDisplayMode, она что-нибудь вернет? Если нет, то ToggleDisplayMode не входит в глобальную область видимости.

user2033671 24.10.2018 15:59

звучит так, как будто ваша функция не входит в глобальную область видимости.

epascarello 24.10.2018 16:04

@epascarello структура что-то вроде <div><script><func></script><all calls to that function></div>

naman1901 24.10.2018 16:07

в какой файл вы добавили тег <script>. попробуйте добавить его в src/index.html в теге <head>.

Aagam Jain 24.10.2018 16:13

Я попытался поместить сценарий поверх своего HTML-файла, но все равно не работал. Есть какие-нибудь указания о том, как сделать его глобальным?

naman1901 26.10.2018 08:44

На мой взгляд, было бы неправильно помещать его в index.html. Функция используется только в определенном месте.

naman1901 26.10.2018 08:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
691
3

Ответы 3

Angular ищет код в файле машинописного текста компонента, поэтому я думаю, вам нужно поместить код туда. Вы можете создать службу для получения кода из серверной части, затем вызвать службу из файла машинописного текста и использовать событие (щелчок) для вызова кода машинописного текста.

Я использую не ngClick, а простой JavaScript onclick, поэтому здесь не должно быть Angular для обработки щелчков.

naman1901 24.10.2018 16:00

попробуй это? stackoverflow.com/questions/42530261/…

megabc123 24.10.2018 18:09

не может этого сделать, потому что идентификаторы динамические и несколько мест используют одну и ту же функцию

naman1901 25.10.2018 10:26

Вам нужно изменить свой код следующим образом:

<a (click) = "ToggleDisplayMode()"><u>show/hide</u></a>

Обратите внимание, что вместо onclick вы должны использовать (click).

Это угловое решение - изменения на этом уровне будут невозможны, поскольку этот HTML-код возвращается SDK, и тот же ответ используется в других, не-Angular интерфейсах.

naman1901 24.10.2018 16:02

Угловая версия 9.1.9 машинописный текст 3.8.3

Вы можете добавить файл js в папку с ресурсами

SRC / активы / js / child2.js

function javaChangeCreatedBy() {
    alert('Set 2 clicked');

    var i_createdby = document.getElementById('inputcreatedbyid')
    var i_value = document.getElementById('inputcreatedbyid').value;
}

Следующий html-код показывает оба подхода - для углового щелчка и для html onclick.

SRC / приложение / первый-компонент / первый-компонент.component.html

<p>
    Enter Created by:<input id='inputcreatedbyid' type = "text" placeholder = "Enter name" [(ngModel)]=inputcreatedby>
    &nbsp;
    <button type = "button" (click) = "ChangeCreatedBy(inputcreatedby)">Set</button> 
    &nbsp;
    <button type = "button" onclick = "javaChangeCreatedBy()">Set 2</button>
</p>

SRC / приложение / первый-компонент / первый-компонент.component.ts

 export class FirstComponentComponent implements OnInit {
      ..
      createdby = 'My name';
      inputcreatedby='';

      ChangeCreatedBy(inputcreatedby:string){
           // var inputvalue = document.getElementById("inputcreatedby").value;
           this.createdby = inputcreatedby;
      }
 }

И, наконец, добавьте файл сценария в файл angular.json

 {
    "projects": {
       "architect": {
           "build": {
              ..
              "options": {
                 ..
                 "scripts": [
                    "src/assets/js/child2.js"
                 ]
              }

Однако angular не поддерживает передачу параметра сценария типа в java-функцию.

Другие вопросы по теме