Додзе, как продлить класс диджит?

1

Мне нужно добавить некоторые пользовательские функции в dijit/form/Select в тот момент, когда я использую следующий код, но я получаю следующую ошибку:

Uncaught TypeError: SelectGroup не является конструктором

Как исправить эту проблему?

require([
  'dijit/form/Select',
  'dojo/_base/window',
  'dojo/domReady!'
], function(Select, win) {

  var SelectGroup = define([
    "dojo/_base/declare",
    "dijit/form/Select"
  ], function(declare, Select) {
    return declare(Select, {
      myCustom: function() {
        alert('hey custom');
      }
    });
  });

  var select = new SelectGroup({
    name: 'select',
    options: [{
      label: '<i>Colors I love</i>',
      value: 'G 1',
      disabled: true
    }, {
      label: 'Red',
      value: '1'
    }, {
      label: 'Green',
      value: '2',
      selected: true
    },
    ]
  }, 'select');

  select.on('change', function(value) {
    alert(value);
  }); 

});
Теги:
dojo
dijit.form

1 ответ

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

Я думаю, что это была просто ошибка от вас, когда вы пишете определение() внутри require (вызовы AMD imbrication)!

Это просто, вы должны сделать весь свой импорт (требуется), включая объявление, и объявить вызов (чтобы сделать ваш виджет direclty), он вернет новый виджет в ссылку var SelectGroup

Ниже приведен рабочий фрагмент:

require([
    "dojo/_base/declare",
    "dijit/form/Select",
    'dojo/_base/window',
    'dojo/domReady!'
  ], function(declare, Select, win) {
  
    var SelectGroup = declare(Select, {
      myCustom: function() {
        alert('hey custom calue is = '+this.value);
      }
    });
    
    var select = new SelectGroup({
    name: 'select',
    options: [{
        label: '<i>Colors I love</i>',
        value: 'G 1',
        disabled: true
      }, {
        label: 'Red',
        value: '1'
      }, {
        label: 'Green',
        value: '2',
        selected: true
      },
    ]
  }, 'select');
    
    
    select.on('change', function(value) {
      select.myCustom();
    });

   
  });
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.12.1/dijit/themes/claro/claro.css" />

<script>
  window.dojoConfig = {
    parseOnLoad: false,
    async: true
  };
</script>


<script src="//ajax.googleapis.com/ajax/libs/dojo/1.12.1/dojo/dojo.js"></script>

<body class="claro">
  <div id="select"></div>
</body>
  • 0
    в чем разница между определением и объявлением?
  • 1
    Да, мы не можем сделать сравнение между объявить и определить :), объявлять это класс js, который в dojo мы можем создавать, классы, виджеты, а также расширять существующий класс или виджет, но define это загрузчик AMD dojo, который загружает эти классы Виджет работает асинхронно, так что вы можете сказать, что сравнение между require и define определено, а не с помощью встроенного объявления (Declare является загруженным классом) и определения rquire.
Показать ещё 4 комментария

Ещё вопросы

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