如何获取 Angular 输入指令数据以传递给控制器

Posted

技术标签:

【中文标题】如何获取 Angular 输入指令数据以传递给控制器【英文标题】:How to get Angular Input Directive Data to Pass to Controller 【发布时间】:2015-06-11 17:31:35 【问题描述】:

我正在使用angular-credit-cards 创建信用卡表单。信用卡号有以下设置:

<!--... form stuff ...-->
<div class="form-group" ng-class="'has-success': donationForm.ccNumber.$valid">
  <label for="ccNumber">Credit Card Number</label>
  <div class="input-group">
    <input type="text" class="form-control" name="ccNumber" ng-model="credit_card.number" cc-number cc-eager-type/>
    <div class="input-group-addon">donationForm.ccNumber.$ccEagerType</div>
  </div>
</div>
<!--... more form stuff ...-->

提交此表单时,它会调用一个创建 Paypal 付款的函数。 Paypal 付款需要信用卡类型。 angular-credit-cards 根据 cc-number 指令所属的输入动态确定信用卡类型,并将其存储在输入的 $ccEagerType 中。但是,如何从输入中获取这些数据并将其交给控制器?

我尝试了以下方法:

<input type="hidden" ng-model="credit_card.type" ng-value="donationForm.ccNumber.$ccEagerType"/>

但是donationForm.ccNumber.$ccEagerType 没有绑定到credit_card.type。

提前致谢。

【问题讨论】:

【参考方案1】:

阅读 readme.md 的那个 github 项目,我们发现:

热切匹配的类型将在模型控制器上以$ccEagerType 的形式提供。

您可以通过表单名称和输入名称在您的父控制器中访问它:

$scope.donationForm.ccNumber.$ccEagerType

在您的情况下,ccNumber 是输入名称。 donationForm 是表单的推断名称,尽管您尚未在代码中发布它。

Ben Drucker 在他的自定义指令 ccNumber 中需要 ngModelController。阅读AngularJS documentation about ngModelController,了解如何处理从指令内部修改的内容。

编辑: (来自 angular-credit-cards 的作者)

我建议避免使用隐藏输入。最好将请求正文的值显式添加到 PayPal,而不是隐式绑定它。

此外,您应该考虑将$ccType 用于全卡。 Eager typing 旨在显示发行者徽标或其他 UI 功能。 $ccType 匹配完整卡号的更严格的正则表达式。可以实现$ccEagerType 已定义但&lt;input/&gt; 无效且因此$ccType 未定义的状态。

【讨论】:

我看到了,但也许我误解了这意味着什么。这是否意味着我可以“导入”类似于 $scope、$resource 等的 $ccEagerType?所以我的控制器看起来像:app.controller('MyController', ['$scope', '$resource', '$ccEagerType',..., function ($scope, $resource, $ccEagerType, ...) ...; 当我这样做时,我得到一个 $injector:unpr 错误。抱歉...这里是 AngularJS 菜鸟。 我理解这一点就像你的MyController 中的$scope.$ccEagerType。如果它是包装该指令的那个。顺便说一句,在 README.md 中有一个显示卡片类型的示例。这不是你想要达到的目标吗? 不幸的是,当我在表单提交函数中检查调试器时,我没有在 $scope 下看到 $ccEagerType。我会尝试在 github repo 上发布一个问题。 这里是角度信用卡的作者。基里尔的回答是正确的。类型为$scope.donationForm.ccNumber.$ccEagerType。我建议避免使用隐藏输入。最好将请求正文的值显式添加到 PayPal,而不是隐式绑定它。 另外,您应该考虑将$ccType 用于全卡。 Eager typing 旨在显示发行者徽标或其他 UI 功能。 $ccType 匹配完整卡号的更严格的正则表达式。可以实现一个状态,其中定义了$ccEagerType,但&lt;input/&gt; 无效,因此$ccTypeundefined【参考方案2】:

隐藏元素似乎有问题,ng-model 绑定不起作用。

Angular 模型绑定在发布表单时未传递隐藏字段

试试下面的代码

<input type="text" style="display: none;" ng-model="credit_card.type" 
ng-value="donationForm.ccNumber.$ccEagerType"/>

Refer this SO Answer

【讨论】:

不幸的是,这不起作用。也许它与我的表单正在进行的一些 html5 验证有关?我现在在表单上有 novalidate 属性。

以上是关于如何获取 Angular 输入指令数据以传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

无法将 iframe 元素从指令传递给 Angular 控制器

angular js权威指南笔记三--向指令中传递数据

Angular如何将数据从指令传递到父组件

如何将多个属性传递给 Angular.js 属性指令?

如何将指令的范围值作为$ scope传递给控制器