JavaScript — объект Firebreath в AngularJS

Я попытался включить объект плагина 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, поэтому, если у кого-то есть какие-либо идеи для этого, это было бы предпочтительным.

Любая помощь приветствуется. Благодарю.

2

Решение

Если кому-то интересно, потому что я не смог запустить событие, я пошел по этой ссылке:

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,

1

Другие решения

Я столкнулся с той же проблемой и смог ее устранить, создав только для чтения nodeName собственность в моем объекте плагина. Я спросил об этом в огненном дыхании сообщение на форуме и таксильщик предложил добавить это в JSAPIAuto.cpp, который также работал, поэтому я представил тянуть запрос с изменением.

1

Однажды я потратил около 6 часов, пытаясь заставить плагины FireBreath работать с jquery; это было действительно образовательно, но в конечном счете я решил, что это не стоило работы.

Короче говоря, это того не стоит; тем более, что даже если бы вы могли заставить его работать, он сломался бы в IE9, где FireBreath не поддерживает addEventListener (IE никогда не дает ему четную информацию, поэтому его немного сложно поддерживать), и вам все равно нужно было бы использовать attachEvent.

0
По вопросам рекламы [email protected]