Я создаю пользовательский элемент управления 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;
});
Что я здесь делаю неправильно? Заранее спасибо.
Оффлайн Ваш код выглядит отлично. WinJS находится в вашем проекте в качестве источника, поэтому вы можете сразу перейти в DOMEventMixin.displatchEventin отладчика и посмотреть, где именно происходит исключение. –
@ KraigBrockschmidt-MSFT, входящий в вызов dispatchEvent (...), немедленно выдает ошибку, он не попадает ни в одну строку, которая может вызвать проблему. Выйдя внутрь после появления ошибки, я перейду в окно .__ BROWSERTOOLS_CONSOLE_SAFEFUNC (fn, safeAssert) '. Вступая во все, что никуда не идет, и в итоге просто сбрасывает отладчик и приложение. –
Попробуйте вызвать self.dispatchEvent, а не self._element.dispatchEvent. Последний вызывает API DOM напрямую, первый проходит через метод в микшировании WinJS - я должен был заметить это различие раньше. И если он по-прежнему падает, объявление не позволяет вам войти через отладчик, откройте файл базы данных WinJS напрямую (в разделе «Ссылки в обозревателе решений VS») и установите точку останова на DOMEventMixin.dispatchEvent. –