我希望在我的模型中将ng-click的函数调用存储为字符串。 我不能使用ng-click =“m.func”,如果我使用ng-click =“{{m.func}}”也不能正常工作。
在ng-click =“{{m.func}}”的情况下,它看起来像1.2.0会引发错误。
我怎样才能让它上班?
<div ng-app="myApp" ng-controller="myCtrl">
<div ng-repeat="m in model"><a href="#" ng-click="{{m.func}}">{{m.caption}}</a></div>
</div>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.model = [
{
caption: 'callme a',
func : 'callme_a()'
},
{
caption: 'callme b',
func : 'callme_b()'
}
]
$scope.callme_a = function() {
alert("called a");
}
$scope.callme_b = function() {
alert("called b");
}
});
答案 0 :(得分:8)
您可以这样做:
在你的HTML中:
<div ng-repeat="m in model"><a href="#" ng-click="call(m)">{{m.caption}}</a></div>
在您的控制器中:
$scope.callme_a = function() {
alert("called a");
}
$scope.callme_b = function() {
alert("called b");
}
$scope.model = [
{
caption: 'callme a',
func : $scope.callme_a
},
{
caption: 'callme b',
func : $scope.callme_b
}
]
$scope.call = function(el) {
el.func();
}
答案 1 :(得分:1)
您可以使用
window["functionName"](arguments) //if the functioName is defined in global (window's scope)
OR
$scope["functionName"](arguments) //if the functioName is defined for $scope
因此,更新的控制器代码(Beterraba)将是
callme_a = function() {
alert("called a");
}
callme_b = function() {
alert("called b");
}
$scope.model = [
{
caption: 'callme a',
func : "callme_a"
},
{
caption: 'callme b',
func : "callme_b"
}
]
$scope.call = function(el) {
window[el.func](arguments)
}
答案 2 :(得分:1)
这是@ Beterraba答案的变体。
HTML:
<div ng-app="myApp" ng-controller="myCtrl">
<div ng-repeat="m in model"><a href="#" ng-click="call(m.func)">{{m.caption}}</a></div>
</div>
JS:
$scope.call = function(func) {
$scope[func]();
}
如果必须使用字符串来定义函数,那么这将起作用。但我希望你再看看你的设计。
此外,为了使其正常工作,您必须取出函数字符串中的()
:
$scope.model = [
{
caption: 'callme a',
func : 'callme_a'
},
{
caption: 'callme b',
func : 'callme_b'
}
]
答案 3 :(得分:0)
可能是ng-click在将其评估为字符串之前,使用ng-click属性将事件侦听器附加到dom。
所以,我已经用超时来覆盖ngclick来制作你想要的东西:)
var app = angular.module('myApp', []);
app.directive('ngClick', ['$timeout','$parse', function($timeout, $parse) {
return {
compile: function($element, attr) {
return function(scope, element, attr) {
//I've wrapped this link function code in a $timeout
$timeout(function() {
var fn = $parse(attr["ngClick"]);
$(element[0]).on("click", function(event) {
scope.$apply(function() {
fn(scope, {$event:event});
});
});
})
};
}
};
}]);
(这是ngClick的源代码 - https://github.com/angular/angular.js/blob/master/src/ng/directive/ngEventDirs.js)
使用演示 - http://jsfiddle.net/R2Cc9/5/
检查小提琴