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节点