当前位置: 首页 > 面试题库 >

如何在AngularJS指令模板中动态定义要用ng-click调用的函数

危烨煜
2023-03-14
问题内容

我正在尝试根据模型动态生成表单输入和关联的操作菜单。我能够传递要使用的字段和菜单,但无法弄清楚如何配置ng-
click来调用模型中定义的适当函数。看到小提琴:http :
//jsfiddle.net/ahonaker/nkuDW/

HTML:

var myApp = angular.module('myApp',[]);

myApp.directive('myDirective', function($compile) {
    return {
        restrict: "E",
        replace: true,
        scope : {
            field: '=',
            label: '=',
            menu: '='
        },
        link:  function (scope, element, attrs) {
            element.html('{{label}}: <input ng-model="field"> <ul ng-repeat="item in menu"<li><a ng-click="item.func">{{item.title}}</a></li></ul>');
             $compile(element.contents())(scope);
        }
    }
});
//myApp.factory('myService', function() {});

function MyCtrl($scope) {
    $scope.status = 'You have not picked yet';

    $scope.menu = [
        { "title" : "Action 1", "func" : "ActionOne()"},
        { "title" : "Action 2", "func" : "ActionTwo()"},
        ]

    $scope.fieldOne = "I am field 1";
    $scope.fieldTwo = "I am field 2";

    $scope.ActionOne = function() {
         $sopce.status = "You picked Action 1";   
     }

    $scope.ActionOne = function() {
         $sopce.status = "You picked Action 2";   
     }            
}

JS:

<div ng-app = "myApp">
    <div ng-controller="MyCtrl">
        <ul>
            <p><my-directive field="fieldOne" label="'Field 1'" menu="menu"></my-directive></p>
            <p><my-directive field="fieldTwo" label="'Field 2'" menu="menu"></my-directive></p>
        </ul>
        Hello, {{status}}!
</div>
</div>

任何帮助,将不胜感激。我在指令中尝试了以下ng-click方法

ng-click={{item.func}}
ng-click="item.func"
ng-click="{{item.func}}"

我究竟做错了什么?还是有更好的方法来做到这一点(包含要调用的功能的菜单结构必须来自模型,以便我构建通用的表单生成功能)。


问题答案:

这是您的固定小提琴:http :
//jsfiddle.net/nkuDW/1/

它有很多问题。

  1. 您有$scope4次错字$sopce
  2. 如果您希望其中的项目$scope.menu能够访问ActionOneActionTwo,则需要在定义的上方定义这些Action函数$scope.menu(这就是在将函数分配给变量时JavaScript的工作方式)。
  3. 您已经ActionOne定义了两次,第二个应该是ActionTwo
  4. ng-click需要方法调用,而不是函数的指针,因此应为ng-click="item.func()"
  5. 您希望菜单项具有指向函数的指针,但是您已将它们定义为字符串…即使您将"ActionOne()"引号排除在外,由于以下两个原因,它仍然无法使用:
    1. ActionOne 在MyCtrl中不作为功能存在,而是需要引用为 $scope.ActionOne
    2. 您只需要一个指向ActionOne的指针,实际上并不需要在这一点上调用它。由于括号的原因,初始化MyCtrl时将同时调用这两个动作。

在进入Angular之前,了解JavaScript的基础可能是一个好主意,因为Angular假定您对语言的细微差别有很好的了解。道格拉斯·克罗克福德(Douglas
Crockford)提供了一系列视频,可以帮助您入门。



 类似资料:
  • 问题内容: 这里有角的菜鸟。我正在创建一个指令以递归显示问题树和子问题树。我正在模板中使用链接,该链接在范围内调用函数。由于某种原因,它不会调用该方法。 这是代码和小提琴http://jsfiddle.net/madhums/n9KNv/ HTML: Javascript: 任何帮助理解这一点将不胜感激。 问题答案: 您遇到范围问题。由于您在指令中使用隔离范围,因此它不再有权访问具有的控制器范围。

  • 问题内容: 我正在尝试根据当前项目动态显示ng-repeat指令中的多个模板之一。 我的JSON数据如下所示: 我的目标是动态渲染数据树,每个组包含多个部分。这些组都将具有相同的模板,但是每个部分都应基于名称字段具有自己的模板。 假设顶层HTML是: 理想情况下,每个部分还需要具有自己的范围数据和与其关联的控制器。我很幸运用Knockout构建了这种类型的系统,但是我想了解Angular的做事方式

  • 问题内容: 当调用这样的函数时: HTML: JS: 一切正常,但是当我的功能在服务中(控制器可以访问)时,不会调用该功能。通过将服务名称作为前缀来调用它也不是一个选择(即使这在javascript代码本身中也有效) 所以我的问题是:当位于服务中的ng-change中调用服务时,正确的方法是什么? 提前致谢 问题答案: 您需要使用通过作用域的函数来调用服务函数。因此,在您的示例中,只要将服务注入到

  • 问题内容: 如何使用动态模板创建指令? 这就是我现在所拥有的,它可以正确显示标签。但是,我不确定如何在模板上附加其他HTML。或将2个模板合并为1个。 问题答案: 有类似的需求。做这份工作。(不完全确定这是否是“ THE”方法,仍然可以通过角度进行工作) http://jsbin.com/ebuhuv/7/edit-我的探索测试。 需要注意的一件事(以我的示例为例),我的要求之一是,一旦单击“保存

  • 问题内容: 我正在尝试根据范围值使用不同的模板进行指令。 这是我到目前为止所做的,我不知道为什么它不起作用http://jsbin.com/mibeyotu/1/edit HTML元素: 指示: 问题答案: 1)您正在将内容作为属性传递到html中。试试这个: 代替: 2)指令的数据部分正在被编译,因此您应该使用其他东西。代替数据类型,例如datan-type。 链接在这里: http://jsb

  • 我正在尝试根据当前项目动态显示ng-重复指令中的几个模板之一。 我的JSON数据如下所示: 我的目标是动态呈现数据树,每组包含多个部分。这些组都将具有相同的模板,但每个部分都应基于名称字段具有自己的模板。 假设顶层HTML为: 理想情况下,每个部分还需要有自己的作用域数据和与之关联的控制器。我很幸运地使用Knockout构建了这种类型的系统,但我正在尝试理解Angular的做事方式。