2015-06-18 2 views
0

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

Это создается с разметкой:

<div class="alphaNavBar" data-win-control="MobMan.Controls.AlphaNavBar"></div> 

Контроль осуществляется здесь. Он генерирует исключение «недопустимый аргумент» в строке dispatchEvent(...).

(function() { 
    var alphaNavBar = WinJS.Class.define(function (el, options) { 
     // Create control 
     var self = this; 
     this._element = el || document.createElement("div"); 
     this._element.winControl = this; 

     this._element.innerText = "Hello World!"; 
     this._selection = false; 

     // Listen for tap 
     this._element.addEventListener("MSPointerDown", function (evt) { 
      // Toggle selection 
      self._selection = !self._selection; 

      // Selection changed, fire event 
      // Invalid argument here 
      self._element.dispatchEvent("mySelectionChanged", { selection: self._selection }); 
      // Invalid argument here 
     }); 
    }); 

    // Add to global namespace 
    WinJS.Namespace.define("MobMan.Controls", { 
     AlphaNavBar: alphaNavBar 
    }); 

    // Mixin event properties 
    WinJS.Class.mix(MobMan.Controls.AlphaNavBar, WinJS.Utilities.createEventProperties("mySelectionChanged"), WinJS.UI.DOMEventMixin); 
})(); 

Это событие прослушаны:

var alphaNavBar = document.querySelector(".alphaNavBar"); 
alphaNavBar.addEventListener("mySelectionChanged", function (evt) { 
    // Should fire when alphaNavBar is tapped 
    debugger; 
}); 

Что я здесь делаю неправильно? Заранее спасибо.

+0

Оффлайн Ваш код выглядит отлично. WinJS находится в вашем проекте в качестве источника, поэтому вы можете сразу перейти в DOMEventMixin.displatchEventin отладчика и посмотреть, где именно происходит исключение. –

+0

@ KraigBrockschmidt-MSFT, входящий в вызов dispatchEvent (...), немедленно выдает ошибку, он не попадает ни в одну строку, которая может вызвать проблему. Выйдя внутрь после появления ошибки, я перейду в окно .__ BROWSERTOOLS_CONSOLE_SAFEFUNC (fn, safeAssert) '. Вступая во все, что никуда не идет, и в итоге просто сбрасывает отладчик и приложение. –

+0

Попробуйте вызвать self.dispatchEvent, а не self._element.dispatchEvent. Последний вызывает API DOM напрямую, первый проходит через метод в микшировании WinJS - я должен был заметить это различие раньше. И если он по-прежнему падает, объявление не позволяет вам войти через отладчик, откройте файл базы данных WinJS напрямую (в разделе «Ссылки в обозревателе решений VS») и установите точку останова на DOMEventMixin.dispatchEvent. –

ответ

0

Я отвечал на мой вопрос here, а также и получил ответ, изменяющий отправку события, как так:

// Listen for tap 
this._element.addEventListener("MSPointerDown", function (evt) { 
    // Toggle selection 
    this._selection = !this._selection; 

    // Create the event. 
    var _event = document.createEvent('customevent'); 

    // Define that the event name is 'mySelectionChanged' and pass details. 
    _event.initCustomEvent('mySelectionChanged', true, true, { selection: this._selection }); 

    // Selection changed, fire event 
    this.dispatchEvent(_event); 
}); 

Это было в состоянии правильно вызвать событие для меня. Все еще не уверен, что я делал неправильно раньше, но теперь это исправлено.

Смежные вопросы