Angular 指令可以编译 ng-click 元素吗
Can Angular directive compile ng-click elements
我写了一个指令来渲染带有 ng-click 指令的子元素,这是我的代码:
指令
angular.module('myApp')
.directive('popover', [
'$compile',
function($compile) {
return {
scope: {
items: "=",
},
link: function($scope, $element, $attrs){
$.each($scope.items, function(key, value) {
var item = '<a ng-click="'+value.ngClick+'">'+value.name+'</a>';
$element.append($compile(item)($scope));
});
}
}
}
]
);
模板
<div popover items="myItems"></div>
控制器
angular.module('myApp')
.controller('MyCtrl', [
'$scope',
function ($scope) {
$scope.myItems = [
{name: 'Do this', ngClick: 'doThis()' },
{name: 'Do that', ngClick: 'doThat()' },
];
$scope.doThis = function() { console.log('this is done') };
$scope.doThat = function() { console.log('that is done') };
}
]
);
渲染工作正常,我得到了一个具有正确属性的 A 元素的列表 ng-click,但是函数 doThis() 和 doThat() 从未被触发
我想问题出在 $compile 命令附近,但我已经在其他上下文中使用过此命令,而且它似乎可以正常工作。此外,在 Chrome 开发工具栏中,我没有看到与元素的 ng-click 指令相关的事件。
有什么想法吗?
谢谢
你的指令有一个独立的作用域,所以 doThis 和 doThat 不是指令的作用域。要么你删除隔离范围,要么你可以像这样传递你的函数:
app.controller('MainCtrl', function($scope) {
$scope.myItems = [
{name: 'Do this', ngClick: doThis },
{name: 'Do that', ngClick: doThat },
];
function doThis() { console.log('this is done') };
function doThat() { console.log('that is done') };
});
app
.directive('popover', function($compile) {
return {
scope: {
items: "=",
},
link: function($scope, $element, $attrs){
$scope.clickFunctions = {};
$.each($scope.items, function(key, value) {
$scope.clickFunctions[value.name] = value.ngClick
var item = '<a ng-click="clickFunctions[\''+value.name+'\']()">'+value.name+'</a>';
$element.append($compile(item)($scope));
});
}
}
}
);
有关演示,请参阅 this plunker。
我写了一个指令来渲染带有 ng-click 指令的子元素,这是我的代码:
指令
angular.module('myApp')
.directive('popover', [
'$compile',
function($compile) {
return {
scope: {
items: "=",
},
link: function($scope, $element, $attrs){
$.each($scope.items, function(key, value) {
var item = '<a ng-click="'+value.ngClick+'">'+value.name+'</a>';
$element.append($compile(item)($scope));
});
}
}
}
]
);
模板
<div popover items="myItems"></div>
控制器
angular.module('myApp')
.controller('MyCtrl', [
'$scope',
function ($scope) {
$scope.myItems = [
{name: 'Do this', ngClick: 'doThis()' },
{name: 'Do that', ngClick: 'doThat()' },
];
$scope.doThis = function() { console.log('this is done') };
$scope.doThat = function() { console.log('that is done') };
}
]
);
渲染工作正常,我得到了一个具有正确属性的 A 元素的列表 ng-click,但是函数 doThis() 和 doThat() 从未被触发
我想问题出在 $compile 命令附近,但我已经在其他上下文中使用过此命令,而且它似乎可以正常工作。此外,在 Chrome 开发工具栏中,我没有看到与元素的 ng-click 指令相关的事件。
有什么想法吗? 谢谢
你的指令有一个独立的作用域,所以 doThis 和 doThat 不是指令的作用域。要么你删除隔离范围,要么你可以像这样传递你的函数:
app.controller('MainCtrl', function($scope) {
$scope.myItems = [
{name: 'Do this', ngClick: doThis },
{name: 'Do that', ngClick: doThat },
];
function doThis() { console.log('this is done') };
function doThat() { console.log('that is done') };
});
app
.directive('popover', function($compile) {
return {
scope: {
items: "=",
},
link: function($scope, $element, $attrs){
$scope.clickFunctions = {};
$.each($scope.items, function(key, value) {
$scope.clickFunctions[value.name] = value.ngClick
var item = '<a ng-click="clickFunctions[\''+value.name+'\']()">'+value.name+'</a>';
$element.append($compile(item)($scope));
});
}
}
}
);
有关演示,请参阅 this plunker。