Я попытался включить объект плагина FireBreath в представление AngularJS, однако, когда я пытаюсь визуализировать представление, я получаю эту ошибку:
TypeError: Cannot read property 'nodeName' of undefined
Я могу успешно включить объект в представление с $compile
как это:
$("body").append($compile('<object id="plugin" type="application/x-firebreathplugin" width="0" height="0></object>')($scope));
Однако после включения такого объекта я не могу заставить свой плагин запускать событие в JS.
Делать что-то вроде этого:
plugin = document.getElementById('plugin');
console.log(plugin);
Возвращает
TypeError
В консоли Chrome. Но я все еще могу сделать:
plugin.callFunction();
И есть метод FireBreath для выполнения. Проблема в том, когда я пытаюсь получить событие, которое будет запущено в JS. Неважно, что я пытаюсь, я не могу получить событие, чтобы запустить. Так что этот код никогда не будет выполняться:
var addEvent = function(obj, name, func) {
obj.addEventListener(name, func, false);
}
addEvent(document.getElementById('plugin'), 'firebreathEvent', function(data) {
console.log('data ' + data);
});
var plugin = document.getElementById('plugin');
plugin.functionThatTriggersFireBreathEvent();
Кто-нибудь знает, связано ли это с доступом к объекту после вызова? $compile
? Я заметил, что при обычном HTML (до использования AngularJS) регистрация плагина в консоли возвращает это:
<JSAPI-Auto Javascript Object>
Так что я думаю, что все, что я получаю с document.getElementById
после использования $compile
не такой же.
Что было бы проще, так это если бы я мог просто включить <object>
тег в файле view.html и отобразить его в <body class='ng-view'>
но я получаю верхнюю ошибку TypeError, поэтому, если у кого-то есть какие-либо идеи для этого, это было бы предпочтительным.
Любая помощь приветствуется. Благодарю.
Если кому-то интересно, потому что я не смог запустить событие, я пошел по этой ссылке:
http://colonelpanic.net/2010/12/firebreath-tips-asynchronous-javascript-calls/
(который, я думаю, ваш блог @taxilian), чтобы вернуть данные в JS.
Код плагина: отличный пример по ссылке.
Код JS:
//attach FireBreath Object to AngularJS View
$("body").append($compile('<object id="plugin" type="application/x-firebreathplugin" width="1" height="1"><param name="onload" value="pluginLoaded"/></object>')($scope));
var callback = function(data) {
//data is an object
console.log(data.resultFromFireBreath);
}
plugin = document.getElementById("plugin");
plugin.getData(callback);
Это будет работать на данный момент, пока кто-то не сможет понять, как прикрепить событие к объекту плагина после $compile
,
Я столкнулся с той же проблемой и смог ее устранить, создав только для чтения nodeName
собственность в моем объекте плагина. Я спросил об этом в огненном дыхании сообщение на форуме и таксильщик предложил добавить это в JSAPIAuto.cpp, который также работал, поэтому я представил тянуть запрос с изменением.
Однажды я потратил около 6 часов, пытаясь заставить плагины FireBreath работать с jquery; это было действительно образовательно, но в конечном счете я решил, что это не стоило работы.
Короче говоря, это того не стоит; тем более, что даже если бы вы могли заставить его работать, он сломался бы в IE9, где FireBreath не поддерживает addEventListener (IE никогда не дает ему четную информацию, поэтому его немного сложно поддерживать), и вам все равно нужно было бы использовать attachEvent.