2

我试图在 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> 

所以我在想,我使用document.getElementById后得到的任何东西$compile都不一样。

更容易的是,如果我可以将<object>标签包含在 view.html 文件中并显示它,<body class='ng-view'>但我得到顶部的 TypeError,所以如果有人对此有任何想法,那将是首选。

任何帮助表示赞赏。谢谢。

4

3 回答 3

1

nodeName我遇到了同样的问题,并且能够通过在我的插件对象中创建一个只读属性来解决问题。我在 firebreath论坛帖子中询问了这个问题,出租车司机建议将其添加到 JSAPIAuto.cpp,这也有效,所以我提交了一个包含更改的拉取请求

于 2013-09-27T02:52:32.393 回答
1

如果有人有兴趣,因为我无法触发该事件,我跟着这个链接:

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.

于 2013-03-13T00:18:37.883 回答
0

我曾经花了大约 6 个小时试图让 FireBreath 插件与 jquery 一起工作;这真的很有教育意义,但最终我认为这不值得。

长话短说,这不值得。特别是因为即使你可以让它工作,它也会在 IE9 上中断,其中 FireBreath 不支持 addEventListener (IE 从不给它偶数信息,所以它有点难以支持),无论如何你都需要使用 attachEvent。

于 2013-03-12T19:55:24.627 回答