ng-model不在Modal内部更新

时间:2015-09-02 05:06:53

标签: angularjs angularjs-directive bootstrap-modal

ng-model我指定的是控制器可以在modal里面看到。但是当我更新模态中的数据时,$ scope变量没有更新。 还有下拉列表无效,我在控制器中定义了它的值。 我是否需要在指令中进行更改。

    <div ng-controller="MainCtrl" class="container">
  <h1>Modal example</h1>
  <button ng-click="toggleModal()" class="btn btn-default">Open modal</button>

  <modal title="Login form" visible="showModal">

      <div>
          <select ng-model="client" ng-change="changeClient()" ng-options="item in clientList">
        <label for="email">Email address</label>
        <input type="text" ng-model="email" id="email" placeholder="Enter email" />
      </div>
      <div class="form-group">
        <label for="password">Password</label>
        <input type="password"  id="password" placeholder="Password" />
      </div>
      <button type="submit" ng-click="buttonClicked()" class="btn btn-default">Submit</button>

  </modal>
</div>

控制器代码

var mymodal = angular.module('mymodal', []);
mymodal.controller('MainCtrl', function ($scope) {
    $scope.email="hello@abc.com";
    $scope.showModal = false;
    $scope.toggleModal = function(){
        $scope.showModal = !$scope.showModal;
    };
    $scope.buttonClicked=function(){
    alert("hello1");
    alert($scope.email);
    alert($scope.client);
    }

    $scope.clientList=["300","600","900"]
    $scope.client=$scope.clientList[0];
    $scope.changeClient = function() {
            selectedValue=$scope.client;
           alert(selectedValue);
         };
  });

mymodal.directive('modal', function () {
    return {
      template: '<div class="modal fade">' + 
          '<div class="modal-dialog">' + 
            '<div class="modal-content">' + 
              '<div class="modal-header">' + 
                '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>' + 
                '<h4 class="modal-title">{{ title }}</h4>' + 
              '</div>' + 
              '<div class="modal-body" ng-transclude></div>' + 
            '</div>' + 
          '</div>' + 
        '</div>',
      restrict: 'E',
      transclude: true,
      replace:true,
      scope:true,
      link: function postLink(scope, element, attrs) {
        scope.title = attrs.title;

        scope.$watch(attrs.visible, function(value){
          if(value == true)
            $(element).modal('show');
          else
            $(element).modal('hide');
        });

        $(element).on('shown.bs.modal', function(){
          scope.$apply(function(){
            scope.$parent[attrs.visible] = true;
          });
        });

        $(element).on('hidden.bs.modal', function(){
          scope.$apply(function(){
            scope.$parent[attrs.visible] = false;
          });
        });
      }
    };
  });

看看 - JsFiddle Link

2 个答案:

答案 0 :(得分:11)

你应该使用:

$parent.email

<input type="text" ng-model="$parent.email" id="email" placeholder="Enter email" />

fiddle

答案 1 :(得分:3)

正如huan feng所说,你可以使用'$ parent'因为指令有它自己的孤立范围。对于“选择”,最简单的解决方案是使用类似的东西:

<select ng-model="$parent.client" ng-change="changeClient()" ng-options="item for item in clientList">

,最好以稍微不同的方式使用您的模型。使用email和clien作为属性创建“clientInfo”对象。 JS:

.controller('MainCtrl', function ($scope) {
    $scope.clientInfo = {};

    $scope.clientInfo.email="hello@abc.com";
    $scope.showModal = false;
    $scope.toggleModal = function(){
        $scope.showModal = !$scope.showModal;
    };
    $scope.buttonClicked=function(){
    alert("hello1");
    alert($scope.clientInfo.email);
    alert($scope.clientInfo.client);
    }

    $scope.clientList=["300","600","900"]
    $scope.clientInfo.client = $scope.clientList[0]; 

    $scope.changeClient = function() {
            selectedValue=$scope.clientInfo.client;
           alert(selectedValue);
         };
  });

和HTML:

<div ng-controller="MainCtrl" class="container">
  <h1>Modal example</h1>
  <button ng-click="toggleModal()" class="btn btn-default">Open modal</button>

  <modal title="Login form" visible="showModal">

      <div>
          <select ng-model="clientInfo.client" ng-change="changeClient()" ng-options="item for item in clientList">
        <label for="email">Email address</label>
        <input type="text" ng-model="clientInfo.email" id="email" placeholder="Enter email" />
      </div>
      <div class="form-group">
        <label for="password">Password</label>
        <input type="password"  id="password" placeholder="Password" />
      </div>
      <button type="submit" ng-click="buttonClicked()" class="btn btn-default">Submit</button>

  </modal>
</div>