AngularJS中的Firebreath对象

Firebreath Object in AngularJS

本文关键字:对象 Firebreath 中的 AngularJS      更新时间:2023-10-16

我试图在AngularJS视图中包含一个FireBreath插件对象,但是当我试图渲染视图时,我得到这个错误:

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> 

所以我认为,无论我使用$compile后得到的document.getElementById是不一样的。

如果我能在view.html文件中包含<object>标签,并让它显示在<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属性来解决问题。我在firebreath论坛的帖子中询问了这个问题,taxilian建议将其添加到JSAPIAuto.cpp中,这也有效,所以我提交了一个带更改的pull请求。

我曾经花了大约6个小时试图使FireBreath插件与jquery工作;它确实很有教育意义,但最终我决定不值得为它付出努力。

长话短说,这是不值得的;特别是因为即使你能使它工作,它会打破IE9,其中FireBreath不支持addEventListener (IE从来没有给它偶数信息,所以它有点难以支持),你将需要使用attachEvent。