CoffeeScript – 不允许在Angularexpression式中引用DOM节点

我的主要问题很简单:

在控制器或指令中进行DOM操作时出现错误,但function完美无缺。

Error: [$parse:isecdom] Referencing DOM nodes in Angular expressions is disallowed! Expression: open() 

我想忽略这些错误,并从functionangular度(而不是从devise的angular度)得到确认安全的做法,

为了简单起见,我希望能够简单回答这个问题,而不用质疑我需要这样做。


现在,如果有人想要更详细地讨论,我有这个要点: https : //gist.github.com/kosz/04f916a5725d85045be5 (依赖:angular,jquery,jquery ui对话框)与我目前遇到的代码行为。

为了摆脱这个错误,我已经尽了最大的努力,根据我读的文档和文档,angular度上的dom操作似乎在指令中被鼓励。

所以我已经使代码与指令工作,但是,它仍然会抛出错误!

正如你所看到的,我正在使用JQuery UI,并显示每个列表项目,如果用户想编辑。 我不是直接操纵dom,但是,我需要一种方法来控制jQuery ui Dialog的closures/打开事件,这不会让Angular填充控制台的错误。

任何有关这方面的见解,非常感谢。

请注意,我知道angularui bootstrap模式,这不是我在这个特定的场景中使用的选项。

由于错误状态,Angular不允许访问expression式中的DOM节点。

如果没有指定,CoffeeScript将使用隐式return

这意味着例如代码中的scope.open函数将会:

 return element.dialog('open'); 

angular会检测到这个并抛出错误。

如果你添加一个明确的return它应该解决这个问题:

 scope.open = => element.dialog('open') return true 

尽pipe接受的答案是正确的,但我仍然想分享我的经验,因为事实certificate这是一个不同的问题。 事实上,我有同样的问题,但我实际上并没有从我的函数(而不是使用CoffeeScript)返回任何东西,所以我感到困惑,努力寻找解决scheme。

在我的情况下,问题似乎是,我是通过DOM节点作为参数的function,如下所示:

 <span ng-mouseenter="doSomething($event.currentTarget)"></span> 

什么certificate是一个解决scheme在这里改变了所提到的代码只传递事件,而不是直接传递节点:

 <span ng-mouseenter="doSomething($event)"></span> 

然后获取控制器/指令中的节点/如下所示:

 doSomething = function(evt){ var elem = evt.currentTarget; // do something with this element... }; 

在expression式尝试访问DOM节点时发生。

AngularJS限制从expression式中访问DOM节点,因为它是执行任意Javascript代码的已知方式。

此检查仅在Angularexpression式的对象索引和函数调用中执行。 这些是开发商更难以防范的地方。 虚线成员访问(如abc)不执行此检查 – 这是由开发人员直接在范围链上暴露这种敏感和强大的对象。

要解决此错误,请避免访问DOM节点。

当事件处理程序调用返回DOM节点的函数时,也会发生$parse:isecdom错误。

 <button ng-click="iWillReturnDOM()">click me</button> 

JS:

 $scope.iWillReturnDOM = function() { return someDomNode; } 

要解决此问题,请避免从事件处理程序返回DOM节点。

注意:这个错误通常意味着您正在从您的控制器访问DOM,这通常是一种糟糕的编码风格,违反了关注点分离的标志。

CoffeeScript中的隐式返回

使用CoffeeScript时,可能会发生此错误,该函数具有一个称为隐式返回的function。 当函数没有显式返回语句时,此语言function返回函数中最后一个取消引用的对象。

在这种情况下解决scheme是添加一个显式的返回语句。 example return false到该函数。

错误:$ parse:isecdom在Expression中引用DOM节点