【问题标题】:Call a bound function within a Directive from an ng-click从 ng-click 调用指令中的绑定函数
【发布时间】:2015-08-16 08:41:49
【问题描述】:

我想知道当单击 div 的一部分时,我能够在指令中调用绑定函数。我目前有一个 div,里面有另一个 div,用作展开 div 的按钮。大 div 具有使其可扩展的指令。我想单击 div 角落的箭头,并让箭头的 ng-click 调用可扩展指令内的绑定函数。这可能吗?如果是这样,我该如何实施?

这是 div 的图片:

<div expandable class="boxWithBorderStyle"> 
   <div class="arrowStyle" ng-click="someFuncInsideExpandableDirective()"> </div>
</div>

【问题讨论】:

  • 你能提供一个 plunker 或 fiddle 演示

标签: javascript html angularjs dom


【解决方案1】:

如果指令使用隔离范围 (scope: {}),则托管指令的元素的内容(即子元素)的范围与指令不同,我怀疑这就是您所拥有的。

为了将内容链接到相同的范围,您需要手动嵌入它们:

.directive("expandable", function(){
  return {
    transclude: true,
    scope: {
       // whatever you have now
    },
    link: function(scope, element, attrs, ctrls, transcludeFn){
       transcludeFn(scope, function(contentClone){
         element.append(contentClone);
       });

       // here you can expose whatever functions you want on the isolate scope:
       scope.someFuncInsideExpandableDirective = function(){
          // do something
       }
    }
  };
});

嵌入函数transcludeFn的第一个参数是被嵌入内容所链接的范围,在这种情况下,它是指令的范围。

但请记住,从您的指令用户的角度来看,这有点尴尬,因为现在他们拥有引用一些“神奇”变量/函数的 HTML(当然由您的指令)对于观察 HTML 的人来说并不明显。想象一下,你会遇到一些指令foo,它做了类似的事情:

 <div foo="abc">
   {{foobar}}
   <button ng-click="doSomethingFoo()">do foo</button>
 </div>

foobardoSomethingFoo 是在 foo 指令的范围内定义的 - 如果不知道 foo 的具体情况,将更难以破译。

【讨论】:

  • 我正在尝试关注您上面的帖子:我已将链接函数更改为“链接:函数(范围、元素、属性、扩展)”以包含我想调用的扩展函数的HTML。我的指令返回一个对象,其中 transclude = true。我在声明要从指令中调用的函数时遇到问题。到目前为止,我有 'expand(scope, function() {alert(id + "expanded!"); });'我遇到错误:“扩展不是函数”我需要在其他地方声明我的函数吗?
  • 另外,如何复制我的内容并将其作为 var 传递?谢谢
  • @hededo, link 函数具有定义明确的参数,可以使用它调用 - 事实上,我已经概述了这些参数是什么 - 你可以了解更多关于它们是什么的信息 here。具体来说,第 5 个参数是transclude 函数。当您调用第 4 个参数(您在本地命名为 expand)时,它没有注入“扩展”函数(无论它是什么)。无论如何,我想我理解你的困难,所以我编辑了答案以澄清
  • @hededo,我不确定您指的是什么“内容”。如果它与原始问题没有直接关系,那么为了避免这是一个加载问题,我建议您针对您的新问题提出一个新问题,例如传递内容(无论您是什么意思)。这将为您提供适当的空间来解释您想要什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多