从指令生成的html中调用范围内的函数
Call function in scope from directive generated html?
我做了一个指令,使用element.html()来设置html。在html代码中,我希望能够在指令使用的范围内调用函数。像这样:
app.directive('myDirective', ['$rootScope', function ($rootScope) {
return {
restrict: 'A',
link: function(scope, element) {
element.html('<button ng-click="doit()">Does not work</button>');
}
};
}]);
doit()函数永远不会被调用。
我做了一个plnkr来演示:
http://plnkr.co/edit/nckqny1FNiJJjthmlSh8?p =预览
当你动态添加HTML时,你必须手动编译并使用$compile服务链接它:
app.directive('myDirective', ['$compile', function ($compile) {
return {
restrict: 'A',
link: function(scope, element) {
var e = angular.element('<button ng-click="doit()">Works Now!!</button>');
element.append(e);
$compile(e)(scope);
}
};
}]);
为什么不只是一个模板呢?
return {
restrict: 'A',
template:'<button ng-click="doit()">Do It</button>',
link: function(scope, element, attrs) {
}
};
另一个方法是:
return {
restrict: 'A',
template: '<button>Brings up alert</button><br><button>Does not work</button>',
link:function(scope, element, attrs){
element.on('click', function(e){
if(e.target.nodeName.toLowerCase() == 'button'){
scope.doit();
}
});
}
};
不像代码示例中那样内联地绑定click事件,你可以像上面那样在链接函数中绑定事件,但是你需要这样做:
- 在指令的返回中使用
template:""
选项 - 在你的链接函数中绑定事件。
- 当前元素是div本身,但是你必须在函数args中传递事件。
- 检查点击的目标是否为
e.target.nodeName
按钮 -
e.target.nodeName
结果tagName为大写,因此在上面的if条件中使用as。 - 如果点击的元素是
button
,执行scope.doit();
相关文章:
- Angularjs无法将单选按钮与嵌套范围内的模型绑定
- 如何使用D3生成特定范围内的随机颜色
- 将自定义css保持在角度范围内
- Angular JS-文本框未在独立范围内更新
- cookie不在网站范围内
- 获取给定JavaScript范围内的解析函数
- 如何在JavaScript中使用此函数对范围内的所有数字求和
- JavaScript-仅验证数值并且在范围内
- JS:从数组中查找特定范围内的最低/最高数字
- 试图检查表单中的值是否为一个设定范围内的数字
- 在十进制范围内搜索
- 基于日期范围的一组日期范围内的天数
- 如何在 Google 应用脚本中 sendEmail 函数的范围内的唯一非空白列中返回值
- 从全局范围内的另一个函数 - Javascript 调用函数构造函数的方法
- 在页面高度的范围内调用jQuery函数
- 在Javascript中,如何引用函数范围内的变量,该变量来自在该函数中调用但在其他地方定义的函数
- 在全局范围内调用变量,并在谷歌应用程序脚本中进行比较
- 从指令生成的html中调用范围内的函数
- 如何在另一个Javascript范围内调用全局变量
- 成功当$http post在方法范围内时未调用回调