web-dev-qa-db-de.com

AngularJS übergeben Zeichenfolge als Funktion, die bei ng-click verwendet werden soll

Ich möchte ng-click eine JavaScript-Funktion zuweisen, deren Name von einem Rest-Service bezogen wird.

<li ng-class="{ active: isActive('url')}" data-ng-repeat="menu in mb.data">
   <a href="{{menu.href}}" data-ng-click="{{menu.javascript}}">{{menu.label}}</a>
</li>

Leider löst der Angularjs-Parser eine Ausnahme aus, wenn {{}} in ng-click verwendet wird. Ich habe also mehrere Workarounds ausprobiert, beispielsweise eine Callback-Funktion

  <a href="{{menu.href}}" data-ng-click="call(menu.javascript)">{{menu.label}}</a>

Aber keine meiner Ideen gelang. Wie kann ich in ng-lick einen Namen für die JavaScript-Funktionen vergeben? Übrigens Die Funktion selbst ist Teil des Bereichs $.

Edit- Hier ist der Controller:

Der "$ menu" -Dienst ist einfach eine Get-Rest-Anforderung. Das Anforderungsergebnis ist ein Json-Objekt und enthält nur Zeichenfolgenwerte. In der aktuellen Ausgabe lautet das Ergebnis für menu.javascript "loginModal ()".

.controller('HeaderController', function($scope, $http, ModalService, $menu, $routeParams) {
    $scope.loginModal = function() {
        console.log("modal", ModalService);
        // Just provide a template url, a controller and call 'showModal'.
        ModalService.showModal({
            templateUrl: "/modals/login.modal.html",
            controller: "LoginController"
        }).then(function(modal) {
            // The modal object has the element built, if this is a bootstrap modal
            // you can call 'modal' to show it, if it's a custom modal just show or hide
            // it as you need to.
            console.log(modal.element);
            modal.element.modal();
            modal.close.then(function(result) {
                console.log(result ? "You said Yes" : "You said No");
            });
        });
    };

    $menu.get($routeParams, function(data){
        $scope.menu = data;
    });
})

Edit 2:

Wenn ich {{menu.javascript}} verwende, ist interessanterweise die korrekte Zeichenfolge "loginModal ()" im DOM verfügbar. Der eckige Parser stoppte dort jedoch aufgrund von Fehlern.

14
KIC

Sie können so etwas tun 

HTML

  <div ng-controller="TodoCtrl">
      <button ng-click="callFunction('testClick')">CLICK ME</button>
  </div>

Controller

function TodoCtrl($scope) {

    $scope.callFunction = function (name){
        if(angular.isFunction($scope[name]))
           $scope[name]();
    }

    $scope.testClick = function(){
        alert("Called");
    }
}

Arbeiten Fiddle

Hoffe das könnte dir helfen. Vielen Dank.

27
Pankaj Parkar

Sie können die Hashmap-Notation verwenden, um auf die Eigenschaft dieses Objekts (in diesem Fall $ scope) zuzugreifen:

<li ng-class="{ active: isActive('url')}" data-ng-repeat="menu in mb.data">
   <a href="{{menu.href}}" data-ng-click="this[menu.javascript]()">{{menu.label}}</a>
</li>
0
Andrey108