javascript - AngularJS 指令 - 在范围参数更改时重新运行链接功能

标签 javascript angularjs angularjs-directive

我有一个构建一组嵌套 <ul> 的指令代表文件夹结构的元素。我使用链接函数创建新的 DOM 元素并将它们附加到指令实例元素:

function link(scope, iElement, iAttr) {
  var rootElement = buildChildElement(scope.tree);
  iElement.append(rootElement);
}

<ul> 中的元素树与 jQueryUI 的拖放交互连接,该交互调用包含指令的 Controller 上的函数,以根据拖放事件更新范围参数。

我想要 <ul>范围参数发生更改时自动更新树。我在我的链接功能中尝试了一个监视功能:

scope.$watch('tree', function(newTree, oldTree) {
  var newRoot = buildChildElement(newTree);
  iElement.contents().remove();
  iElement.append(newRoot);
}

这在一定程度上起作用,但是对 remove() 的调用触发 $watch()第二次方法最终恢复我的 Controller 更改。如果我注释掉 remove() , 我可以看到一个新的 <ul>编写的树正确反射(reflect)了 Controller 中对参数所做的更改。

双发 $watch()让我觉得我做错了。没有它,我的参数会正确更新,但我的 <ul>不更新(被丢弃的元素停留在它被丢弃的地方)。

确保您的指令在范围参数之一发生变化时刷新的正确方法是什么?

我应该使用 compile 吗?功能和构建 <ul>基于属性数组而不是使用 link 的树功能?

最佳答案

您的方法非常 jQuery 风格。我想你会发现在这种情况下你是在反对 Angular。 sh0ber 的问题是正确的;你应该发布一个演示或其他东西,或者至少一些示例代码,这样你就可以得到一个有效的答案。

我想你想做一个递归树指令。 Check out this SO answer对于一些有趣的方法。主要思想是 watch 是不必要的。只需更改对象,Angular 就会处理剩下的事情。最有效的方法是直接更改特定的节点对象而不是替换整个对象,但这也行得通。

关于javascript - AngularJS 指令 - 在范围参数更改时重新运行链接功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858533/

相关文章:

javascript - 为什么 &lt;script&gt; 元素的数量会影响全局定义的函数?

javascript - 获取 orderByChild equalTo 中的项目数

angularjs - 在angularjs中将毫秒转换为DD/MM/YYYY格式的日期

javascript - 基本的 jquery fiddle 到 Angular 指令

javascript - 小于和大于会产生意想不到的结果。

javascript - jQuery 鼠标悬停在 DOM 上

javascript - 将 html 表导出到 Excel 时如何更正特殊字符

javascript - Angularjs 处理嵌套的 promise

javascript - 在foreach javascript( Angular )中用foreach填充数组

javascript - 使用 ng-repeat 渲染嵌套指令时出错