web-dev-qa-db-ja.com

angular ui bootstrap modal to viewからフォームデータを渡す方法

Webアプリケーションを作成していて、友達を追加するオプションを実装したいと思います。テキスト入力フィールドを持つモーダルとして友達追加ページを作成しました。ビューページに入力を表示して、これをテストしたいと思います。このデータをビューページに表示するにはどうすればよいですか?

これが私が現在持っているものです

index.html

<div ng-controller="ModalDemoCtrl">
    <script type="text/ng-template" id="myModalContent.html">
        <div class="modal-header">
            <h3 class="modal-title">I'm a modal!</h3>
        </div>

         <form name = "addFriendForm">
          <input ng-model = "user.name"class="form-control" type = "text" placeholder="Username" title=" Username" />
          {{ user.name }}
        </form>

        <div class="modal-footer">
            <button class="btn btn-primary" ng-click="ok()">OK</button>
            <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
        </div>
    </script>

    <button class="btn btn-default" ng-click="open()">Add Friend</button>
    <div> Username: {{user.name}}</div>
</div>

私のJavaScriptファイル:

angular.module('ui.bootstrap.demo', ['ui.bootstrap']);
angular.module('ui.bootstrap.demo').controller('ModalDemoCtrl', function ($scope, $modal, $log) {

  $scope.user = {name: ""}

  $scope.open = function () {

    var modalInstance = $modal.open({
      templateUrl: 'myModalContent.html',
      controller: 'ModalInstanceCtrl',
      resolve: {
        items: function () {
          return $scope.items;
        }
      }
    });

    modalInstance.result.then(function () {
      $scope.user.name = user.name;}, function () {
      $log.info('Modal dismissed at: ' + new Date());
    });
  };
});

angular.module('ui.bootstrap.demo').controller('ModalInstanceCtrl', function ($scope, $modalInstance) {

  $scope.ok = function () {
    $modalInstance.close($scope.user.name);
  };

  $scope.cancel = function () {
    $modalInstance.dismiss('cancel');
  };
});

plunkr: http://plnkr.co/edit/JIoiNx47KXsY8aqbTUDS?p=preview

15
user2016462

解決- plunkr

modalInstanceresolveプロパティを利用できます。これは、モーダルインスタンスと親コントローラー間のリンクとして機能します。

オブジェクトをModalInstanceControllerに注入し、モーダルインスタンスのスコープに割り当てます。

UIブートストラップ解決は、ngRouterとまったく同じように機能します。したがって、何らかの理由でresolveがオブジェクトをresolveできない場合、モーダルは開きません。

var modalInstance = $modal.open({
  templateUrl: 'myModalContent.html',
  controller: 'ModalInstanceCtrl',
  resolve: {
    user: function() {
      return $scope.user;
    }
  }
});

スコープ- plunkr

別の、そして間違いなくより簡単な方法は、親スコープをモーダルに渡すことです。現在、これは、親コントローラーでcontrollerAs構文を使用している場合は機能しません。

var modalInstance = $modal.open({
  templateUrl: 'myModalContent.html',
  controller: 'ModalInstanceCtrl',
  scope: $scope
});
20
Matt

代わりに、結果のpromiseを使用して、値をコントローラーの変数に設定することをお勧めします。私の理解による「解決」は、コントローラの変数をダイアログに渡してダイアログ内で使用するためのものであり、直接変更されることはありません。コード例では、$ modalInstance.close()で設定した結果をmodalInstance.result.then()に渡すとうまくいきます。つまり、18行目と19行目を次のように変更します。

modalInstance.result.then(function (data) {
$scope.user.name = data;

コードを少し改善するために、実際にユーザーオブジェクト全体を渡して、メール、アドレスなどの属性をユーザーオブジェクトに簡単に追加できるようにすることができます。 http://plnkr.co/edit/oztYRNrCRlF1Pw289i1M?p=preview で例を作成しました。

1
barryku