当前位置: 首页 > 知识库问答 >
问题:

AngularJS模态对话框形式对象在控制器中未定义

阎志义
2023-03-14

我们有一个打开模态对话框的页面,表单如下。然而,当我们击中应该处理表单动作的控制器时,表单对象是未定义的,我是一个太多的Angular新手,无法理解为什么...

这是父页面控制器,具有打开模式对话框的功能:

app.controller('organisationStructureController', ['$scope', ..., '$modal', function ($scope, ..., $modal) {

    $scope.openInvitationDialog = function (targetOrganisationId) {
      $modal.open({
          templateUrl: 'send-invitation.html',
          controller: 'sendInvitationController',
          resolve: {$targetOrganisationId: function () {
            return targetOrganisationId;
          }
          }
        }
      );
    };

在这样的页面上:

// inside a loop over organisations
<a ng-click="openInvitationDialog({{organisation.id}})">Invite new member</a>

“邀请”对话框html如下所示:

    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <!-- ... -->
            </div>
            <div class="modal-body">
                <form name="invitationForm">

                    <div class="form-group">
                        <label for="email" style="color:white;">Email</label>
                        <input type="email" class="form-control"  autocomplete="off" placeholder="New member email" id="email" name="email" ng-model="invitation.email" required="true"/>
                        <span class="error animated fadeIn" ng-show="invitationForm.email.$dirty && invitationForm.email.$error.required">Please enter an email address!</span>
                        <span class="error animated fadeIn" ng-show="invitationForm.email.$error.email">Invalid email</span>
                    </div>

                    <!-- ... -->

                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
                        <button type="submit" class="btn btn-primary" ng-click="sendInvitation()">Invite</button>
                    </div>
                </form>
            </div>
        </div>
    </div>

应该处理邀请的控制器在其他地方:

  app.controller('sendInvitationController', ['$targetOrganisationId', '$scope', ...,
    function ($targetOrganisationId, $scope, ...) {

    $scope.invitation = {
      // ...
      targetOrganisation: {
        id: $targetOrganisationId
      }
    };

    $scope.sendInvitation = function () {

      // $scope.invitationForm is undefined
      if ($scope.invitationForm.$invalid) {
        return false;
      }

      // send the invitation...

    };
  }]);

那么,将表单作用域放入控制器的正确方法是什么?

也许我需要将$modal注入sendInvitationController并向其添加sendInvitation功能?但是当我这样做的时候,动作永远不会进入控制器。或者我必须将处理提交操作的函数添加到$modal。打开({…而不是引用控制器?尽管我更喜欢将sendInvitationController放在它自己的文件和作用域中。

感谢任何帮助!

编辑

我们发现了一些有助于我们构建解决方案并可能有助于某人自己回答问题的东西:

  1. $scope.invitation对象在sendInvitationController中不是未定义的,但保存正确的数据,而$scope.invitationForm保持未定义。
  2. 在send-invitation.html中,我们可以访问$scope.invitationForm.

所以问题是:invitationForm对象与$scope对象的绑定为什么在提交时失败,而表单模型绑定正确?


共有3个答案

太叔何平
2023-03-14

“为什么”这个问题的答案是"范围"。tl; dr you使用模态对话框创建了一个新范围,该对话框向控制器隐藏了范围的表单对象。

如果我们简化您的代码,大致可以得到以下结果:

<div ng-ctrl="organizeCtrl">
  <modal-dialog>
    <form name="invitationForm">
      <input type="email" ng-model="invitation.email" placeholder="Enter email..." />
      <input type="submit" ng-click="sendInvitation()" text="Invite!" />
      <input type="button" ng-click="cancel()" text="Cancel  :(" />
    </form>
  </modal-dialog>
</div>

(这是一个非常简化的版本,应该仍然包含所有核心组件。)现在,让我们看看作用域是在哪里创建的,以及在其中注入了什么。

<div ng-ctrl="sendInvitationController">
<!-- scope created above with "invitation" and "sendInvitation" from sendInvitationController -->
  <modal-dialog>
  <!-- scope created above for the modal dialog transclude -->
    <form name="invitationForm">
    <!-- add "invitationForm" to the modal dialog's scope -->
      <input type="email" ng-model="invitation.email" placeholder="Enter email..." />
      <input type="submit" ng-click="sendInvitation()" text="Invite!" />
      <input type="button" ng-click="cancel()" text="Cancel  :(" />
    </form>
  </modal-dialog>
</div>

在这里,您可以看到在中创建了一个新的子作用域。

<div ng-ctrl="organizeCtrl">
  <modal-dialog>
    <form name="invitationForm">
      <input type="email" ng-model="invitation.email" placeholder="Enter email..." />
      <input type="submit" ng-click="sendInvitation(invitationForm)" text="Invite!" />
      <input type="button" ng-click="cancel()" text="Cancel  :(" />
    </form>
  </modal-dialog>
</div>

控制器接受邀请表单作为sendInvation函数的参数:

app.controller('sendInvitationController', ['$targetOrganisationId', '$scope', ...,
  function ($targetOrganisationId, $scope, ...) {
  $scope.invitation = {
    targetOrganisation: {
      id: $targetOrganisationId
    }
  };
  $scope.sendInvitation = function (form) {
    if (form.$invalid) {
      return false;
    }
    // send the invitation...
  };
}]);

@Robin确定了另一种解决方案,特别是在sendInvitationController的作用域中创建一个根对象,然后将表单直接附加到该对象,依靠Angular的作用域遍历机制在

希望这有助于您或其他人学习角范围。

丁善
2023-03-14

2014年11月更新:从angular ui引导开始,转换范围与控制器范围合并。没有必要做任何事情。

0.12.0之前:

要将InvitationForm直接放在父控制器作用域中,您需要通过以下方式绕过被转移的作用域:

<form name="$parent.invitationForm">

以上将在父控制器中自动创建表单对象。不需要预先初始化的东西,长的对象路径或通过事件传递。一旦模式打开,只需使用$scope.invitationForm访问它。

公西鸿博
2023-03-14

我也有同样的问题,可以通过在modals控制器的范围内定义form对象来解决。要使代码正常工作,请输入,例如,$scope。形式={} 在控制器的开头,并将表单标记更改为

 类似资料:
  • 问题内容: 我们有一个页面打开一个模态对话框,其形式如下。但是,当我们点击应该处理表单动作的控制器时,表单对象是未定义的,并且我太过喜欢Angular新手了,不明白为什么… 这是父页面控制器持有的用于打开模式对话框的功能: 在这样的页面上: 邀请对话框html如下所示: 应该处理邀请的控制器在其他地方: 那么将表单范围带入控制器的正确方法是什么? 也许我需要注入并将其添加到函数中?但是当我这样做时

  • 本文向大家介绍详解AngularJS 模态对话框,包括了详解AngularJS 模态对话框的使用技巧和注意事项,需要的朋友参考一下 在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念 模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入 非模态对话框:各窗口之间不影响 主要区别:非模态对话框与APP共用消息循环,不会独占用户。 模态对话框独占用户输入,其他界面无法

  • 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是 Qt 所 独有的,在各种不同的平台下都存在。又有叫法是称为模式对话框,无模式对话框等。 所谓模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进 行交互,直到该对话框关闭。对于非模 态对话框,当被打开时,用户既可选择和该对话框进 行交互,也可以选择同应用程序的其他窗口交互。 在 Qt

  • 我有一个标题中描述的问题。 问题的小说明如下:我有一个按钮,用来打开对话框。然后,在该对话框中,有一个按钮,可以在第一个对话框的顶部打开另一个对话框。单击第二个按钮后,我希望调用控制器中的方法,但什么也没发生。h:outputText中的值被正确读取,所以我猜这不是连接控制器的问题- 我用的是: Spring web 3.1.2.发布 JSF 2.2.10 Primeface 5.1 代码: 豆。

  • 问题内容: 我使用Angular组件(this的第一个示例)。当我在组件中绑定对象时,可以在模板中访问它,但不能在控制器中访问它。 js: 的HTML: 模板html(在这里有效): 错误: ReferenceError:未定义英雄 Plunker:https://plnkr.co/edit/U9CJLs6jgrlsZH6tUdr0 问题答案: 您将在上下文中获得价值 虽然以上行不通。因为它不会在

  • 本文向大家介绍BootStrap+Angularjs+NgDialog实现模式对话框,包括了BootStrap+Angularjs+NgDialog实现模式对话框的使用技巧和注意事项,需要的朋友参考一下 本篇文章主要介绍了"angularjs+bootstrap+ngDialog实现模式对话框",对于Javascript教程感兴趣的同学可以参考一下: 在完成一个后台管理系统时,需要用表显示注册用户