如何将模型属性用作变量ng-click

时间:2013-11-12 13:23:45

标签: angularjs angularjs-ng-click

我希望在我的模型中将ng-click的函数调用存储为字符串。 我不能使用ng-click =“m.func”,如果我使用ng-click =“{{m.func}}”也不能正常工作。

http://jsfiddle.net/j8wW5/19/

在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");
    }
});

4 个答案:

答案 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();   
}

Fiddle

答案 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答案的变体。

Here is the fiddle.

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/

检查小提琴