ng-click 在指令模板中不起作用

2023-12-28

这里是有角度的菜鸟。我正在创建一个指令来递归显示问题树和子问题。我在模板中使用一个链接,该链接调用范围内的函数。由于某种原因,它不会调用editQuestion() method.

这是代码和小提琴http://jsfiddle.net/madhums/n9KNv/ http://jsfiddle.net/madhums/n9KNv/

HTML:

<div ng-controller="FormCtrl">
  <questions value="survey.questions"></questions>
</div>

JavaScript:

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

function FormCtrl ($scope) {
  $scope.editQuestion = function (question) {
    alert('abc');
  };
  $scope.survey = {
    // ...
  }
}


app.directive('questions', function($compile) {
  var tpl = '<ol ui-sortable' +
    ' ng-model="value"' +
    ' class="list">' +
    '  <li ng-repeat="question in value | filter:search"' +
    '     <a href="" class="question">' +
    '       {{ question.name }}' +
    '     </a>' +
    '     <span class="muted">({{ question.type }})</span>' +
    '     <a href="" class="danger" ng-click="removeQuestion(question)">remove</a>' +
    '     <a href="" class="blue" ng-click="editQuestion(question)">edit</a>' +
    '     <choices value="question.choices"></choices>' +
    '  </li>' +
    '</ol>';

  return {
    restrict: 'E',
    terminal: true,
    scope: { value: '=' },
    template: tpl,
    link: function(scope, element, attrs) {
        $compile(element.contents())(scope.$new());
    }
  };
});

app.directive('choices', function($compile) {
  var tpl = '<ul class="abc" ng-repeat="choice in value">'+
    '  <li>' +
    '    {{ choice.name }}' +
    '    <span class="muted">' +
    '      ({{ choice.questions.length }} questions)' +
    '    </span>' +
    '' +
    '    <a href=""' +
    '      ng-click="addQuestions(choice.questions)"' +
    '      tooltip="add sub questions">' +
    '      +' +
    '    </a>' +
    '' +
    '    <questions value="choice.questions"></questions>'
    '  </li>' +
    '</ul>';

  return {
    restrict: 'E',
    terminal: true,
    scope: { value: '=' },
    template: tpl,
    link: function(scope, element, attrs) {
        $compile(element.contents())(scope.$new());
    }
  };
});

任何有助于理解这一点的帮助将不胜感激。


你有一个范围问题。由于您在指令中使用了隔离范围scope: { value: '=' },它不再有权访问您的控制器的范围editQuestion.

你需要通过editQuestion沿着你的指令的范围,这样它就知道如何调用它。这通常非常简单,但由于无限递归的指令结构,其中选择可以包含问题,所以它变得有点棘手。这是一个工作小提琴:

http://jsfiddle.net/n9KNv/14/ http://jsfiddle.net/n9KNv/14/

HTML 现在包含对editQuestion:

<div ng-controller="FormCtrl">
    <questions value="survey.questions" on-edit="editQuestion(question)"></questions>
</div>

你的问题指令现在期望onEdit其范围内的属性:

app.directive('questions', function($compile) {
  var tpl = '<ol ui-sortable' +
    ' ng-model="value"' +
    ' class="list">' +
    '  <li ng-repeat="question in value | filter:search"' +
    '     <a href="" class="question">' +
    '       {{ question.name }}' +
    '     </a>' +
    '     <span class="muted">({{ question.type }})</span>' +
      '     <a href="" class="blue" ng-click="onEdit({question: question})">edit</a>' +
      '     <choices value="question.choices" on-edit="onEdit({question: subQuestion})"></choices>' +
    '  </li>' +
    '</ol>';

  return {
    restrict: 'E',
    terminal: true,
      scope: { value: '=', onEdit: '&' },
    template: tpl,
    link: function(scope, element, attrs) {
        $compile(element.contents())(scope.$new());
    }
  };
});

app.directive('choices', function($compile) {
  var tpl = '<ul class="abc" ng-repeat="choice in value">'+
    '  <li>' +
    '    {{ choice.name }}' +
    '    <span class="muted">' +
    '      ({{ choice.questions.length }} questions)' +
    '    </span>' +
    '' +
      '    <questions value="choice.questions" on-edit="onEdit({subQuestion: question})"></questions>'
    '  </li>' +
    '</ul>';

  return {
    restrict: 'E',
    terminal: true,
      scope: { value: '=', onEdit: '&' },
    template: tpl,
    link: function(scope, element, attrs) {
        $compile(element.contents())(scope.$new());
    }
  };
});

注意我们如何定位question in the ng-click。这就是您在回调函数中定位参数的方式。还要注意如何在on-edit我们正在传递给你choices指令,我们的目标subQuestion。这是因为question已经被保留在里面ngRepeat,所以我们需要区分两者。

这可能是迄今为止我在 Angular 中学习的最难的概念。一旦您了解了控制器、指令和其他指令之间的作用域如何工作,Angular 的世界就属于您了。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ng-click 在指令模板中不起作用 的相关文章

随机推荐

  • CMake 不链接 ncurses

    我对 CMake 完全是菜鸟 我的CMakeLists txt非常基本 cmake minimum required VERSION 2 4 6 set the default path for built executables to t
  • 使用 ADO.NET 重命名列名称并更改表中列的数据类型

    如何使用 Ado net 重命名表中的现有列并更改列的数据类型 您可以为此调用存储过程 如下所示 EXEC sp rename MyTable OldColumnName NewColumnName 参见部分 Renaming a Colu
  • Xcodebuild:无法找到与提供的目标说明符匹配的目标

    我想在不同的平台版本上测试相同的单元测试 但是 由于 xcodebuild 错误 我不能 我建立了我的项目 xcodebuild build for testing configuration Debug scheme UnitTest s
  • 使用 ANTLR4 解析公式

    我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集 例如它应该解析 a 4 b 10 to frac a 4 b cdot 10 我的简单语法创建了一棵这样的树 现在我正在尝试实现解析树侦听器 以在遍历树时以某种方式构造 L
  • ValueError:加载 keras 模型时未知层:名称

    我训练了一个 CNN 并相应地保存了它 model Sequential model add Flatten input shape train data shape 1 model add Dense 256 activation rel
  • 即使是简单的 Moq 代码也会抛出 NotSupportedException

    我一直在努力使用 Moq 作为模拟框架 并复制了一些非常简单的示例代码 我一定在这里错过了一些非常愚蠢的东西 即使它指向 Returns 方法 它也会在 Setup 调用时引发 NotSupportedException 此代码是我的测试类
  • 在启动时为所有用户启动应用程序,但也允许每用户设置 (Windows)

    我需要我的应用程序安装程序将程序设置为为所有用户自动启动 那么每个单独的用户应该能够修改这个选项而不影响其他人 目前我写入 HKLM Run with installer 这完成了第一个任务 但是我无法为当前用户禁用自动运行 因为删除 HK
  • 如何解决 javax.xml.transform.TransformerConfigurationException

    我正在尝试使用 xsl 样式表将 xml 文件转换为 html 请参阅下面的代码 我尝试了很多方法来解决这个问题 但不知何故无法解决 如果我打开 xml 文件 那么我可以看到所需的输出 但为什么我无法通过编程看到相同的输出 错误信息 错误
  • 在 Android 中的 Twitter 和 Facebook 上分享文本/图像

    我已经开发了我的新闻应用程序 现在我必须添加共享 facebook twitter 选项来共享图像和文本 我已经搜索了很多 但不清楚如何满足我的要求 实际上在共享按钮上我必须显示编辑文本和按钮无论我们要分享什么 只要点击应该分享的分享按钮即
  • 结合到自动状态机中的 Whens

    我正在向 MassTransit 状态机传奇发出请求并等待回复 但我可能会遇到两个错误 MyRequest TimeoutExpired 已过期 我的请求 故障 我不关心在哪些条件下未满足请求 我希望这两种情况都会导致发布错误消息 但是 我
  • MySQL 根据另一个表的值更新表

    我有两张桌子 这是我的第一张桌子 ID SUBST ID CREATED ID 1 031938 TEST123 2 930111 COOL123 3 000391 THIS109 4 039301 BRO1011 5 123456 COO
  • 是否可以在 Terraform SDK v2 中对 TypeMap 使用 DiffSuppressFunc?

    当我创建新属性时 foo Type schema TypeMap Elem schema Schema Type schema TypeString Sensitive true Required true ForceNew false 一
  • Paramiko exec_command 的实时输出[重复]

    这个问题在这里已经有答案了 NOTE 我看过其他关于此问题的帖子 但没有一篇帖子可以解释答案 也没有一个有效的帖子 有没有办法获得输出exec command 专门针对exec command docker run
  • -webkit-tap-highlight-color 不适用于区域标签

    好吧 我知道这个问题已经被问过很多次了 但我的情况有点不同 我有一个图像地图 并且我不希望 Android iPhone 在点击图像上的区域时显示绿色边框 iPhone 上的灰色覆盖层 我努力了 webkit tap highlight c
  • type.__getattribute__ 和 object.__getattribute__ 有什么区别?

    Given In 37 class A f 1 In 38 class B A pass In 39 getattr B f Out 39 1 好吧 要么调用 super 要么抓取 mro In 40 getattr A f Out 40
  • 如何从 FastAPI 端点返回字典 + 图像?

    我正在尝试使用 FastAPI 来允许我的 dockerized 服务器响应返回的 API 调用 一个图像image and 一本字典additional dict 对于机器学习示例 这可能是来自分类器和显着性图的分类标签 就我而言 我认为
  • 哪种方式交换两个变量值更优化?

    这些方法是关于在 javaScript 中交换两个变量的 方法一 var a 0 b 1 c a a b b c 方法二 var a b 0 1 a b b a 这里你可以自己看看 改变NUMBER OF TIMES如你所愿 还可以根据需要
  • 单击 matplotlib 散点图点以根据点的元数据显示另一个图表?

    我已经得到了this https stackoverflow com a 52261010 11751799在我的机器上运行 它给了我一个想法 我可以根据点的元数据显示一个新图表 而不是打印字符串吗 为了了解我的数据 我有一个包含实验名称和
  • 从 AmazonS3 加载 swf - 跨域策略

    我有一个位于domainA 中的Flash 应用程序 它需要加载来自Amazon S3 存储桶的swf 加载时出现以下错误 Error 2044 Unhandled securityError text 我已将跨域文件放入存储桶中 并认为这
  • ng-click 在指令模板中不起作用

    这里是有角度的菜鸟 我正在创建一个指令来递归显示问题树和子问题 我在模板中使用一个链接 该链接调用范围内的函数 由于某种原因 它不会调用editQuestion method 这是代码和小提琴http jsfiddle net madhum