Хобрук: Ваш путь к мастерству в программировании

Диалог Dijit в JSFiddle запускается сразу, а не onClick

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

Автор использует:

new Button({label: 'Show dialog', onClick: function() {
   //Create dialog programmatically here
}
});

но я изменил это, чтобы оно было немного другим:

function launchSelectDialog(selectOptions) {
    //Create dialog programmatically here
}
registry.byId("default-launch", "onClick", launchSelectDialog(allOpts));

Вот моя версия. К сожалению, это просто запускает диалоговое окно сразу после загрузки страницы, и никогда больше, когда нажатие на кнопку.

Я проверил параметр NoWrap в JSFiddle. У меня нет других сведений о том, что происходит. Пожалуйста, помогите, если у вас есть идеи.

30.08.2016

Ответы:


1

Есть пара вопросов.

1) Как указывали другие, вы вызываете функцию, а не настраиваете событие с помощью функции. следовательно, диалог виден при загрузке.

2) Вам нужно дождаться, пока html не будет проанализирован. или вам нужно использовать parser.parse()

Вот обновленный скрипт: http://jsfiddle.net/49y3rxzg/9/

30.08.2016
  • В случае использования parser.parse() я бы предложил использовать его с помощью parser.parse().then(); 31.08.2016
  • Большое спасибо! Это все объясняет. 31.08.2016

  • 2

    () – это оператор вызова. Вы сами вызываете функцию, и возвращаемое значение функции устанавливается в качестве обработчика события. Если вы хотите повторно использовать функцию, используйте замыкание:

    function launchSelectDialog(selectOptions) {
        // the returned function will be used as the event handler
        return function() {
           // the passed `selectOptions` is remembered in this context
        }
    }
    

    Другой вариант:

    registry.byId("default-launch", "onClick", function() {
       launchSelectDialog(allOpts);
    });
    
    30.08.2016

    3

    Вам нужно инициировать виджет Button перед получением с помощью registry.byId(). В вашем коде на самом деле registry.byId("default-launch") возвращал undefined;

    Также функция registry.byId() принимает только id, поэтому дополнительные параметры будут игнорироваться.

    Чтобы исправить это, вы должны правильно инициировать экземпляр Button и объявить launchSelectDialog(allOpts) внутриonClick как:

      var myButton = new Button({
        label: "Default Options",
        onClick: function() {
          launchSelectDialog(allOpts);
        }
      }, "default-launch");
    

    Ниже исправлена ​​версия для вашего скрипта.

    http://jsfiddle.net/usm829jq/

    require([
      "dojo/dom",
      "dijit/Dialog",
      "dijit/form/Button",
      "dijit/layout/BorderContainer",
      "dijit/layout/ContentPane",
      "dijit/registry",
      "dojo/domReady!"
    ], function(dom, DijitDialog, Button, BorderContainer, ContentPane, registry) {
    
      var allOpts = [{
        label: "Foo",
        value: "foo"
      }, {
        label: "Bar",
        value: "bar"
      }]
    
      var myButton = new Button({
        label: "Default Options",
        onClick: function() {
          launchSelectDialog(allOpts);
        }
      }, "default-launch");
    
    
      function launchSelectDialog(SelectOptions) {
        var layout = new BorderContainer({
          design: "headline",
          style: "width: 400px; height: 400px; background-color: yellow;"
        });
    
        var centerPane = new ContentPane({
          region: "center",
          style: "background-color: green;",
          content: "center"
        });
    
        var actionPane = new ContentPane({
          region: "bottom",
          style: "background-color: blue;"
        });
    
        (new Button({
          label: "OK"
        })).placeAt(actionPane.containerNode);
        (new Button({
          label: "Cancel"
        })).placeAt(actionPane.containerNode);
    
        layout.addChild(centerPane);
        layout.addChild(actionPane);
        layout.startup();
    
        var dialog = new DijitDialog({
          title: 'dialog title',
          style: {
            //width: '400px',
            //height: '400px',
          },
          content: layout
        });
    
        dialog.containerNode.style.backgroundColor = "red";
        dialog.startup();
        dialog.show();
    
      }
    })
    
    30.08.2016
    Новые материалы

    Управление DOM для чайников вроде меня
    Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

    Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
    На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..