Scope issue in AngularJS using AngularUI Bootstrap Modal

后端 未结 3 970
独厮守ぢ
独厮守ぢ 2020-11-28 06:36

plunker: http://plnkr.co/edit/wURNg8ByPYbEuQSL4xwg

example.js:

angular.module(\'plunker\', [\'ui.bootstrap\']);
  var ModalDemoCtrl          


        
相关标签:
3条回答
  • 2020-11-28 06:58

    Looks like a scope issue. I got it to work like this:

    var ModalInstanceCtrl = function ($scope, $modalInstance) {
        $scope.input = {};
        $scope.ok = function () {
            alert($scope.input.abc);
        };
    
        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };
    };
    

    HTML:

    <textarea ng-model="input.abc"></textarea>
    
    0 讨论(0)
  • 2020-11-28 07:03

    Update Nov 2014: the issue is fixed with angular-ui-bootstrap 0.12.0 - the transclusion scope is merged with the controller's scope. There is no need to do anything. Just stay with:

    <textarea ng-model="text"></textarea>
    

    Before 0.12.0:

    Angular-UI modals are using transclusion to attach modal content, which means any new scope entries made within modal are created in child scope.

    You should use inheritance and initialize empty text entry in parent $scope or you can explicitly attach the input to parent scope:

    <textarea ng-model="$parent.text"></textarea>
    
    0 讨论(0)
  • 2020-11-28 07:03

    Let'me try to explain the reason. ui-bootstrap modal sourcecode:

    .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) {
    return {
      restrict: 'EA',
      scope: {
        index: '@',
        animate: '='
      },
      replace: true,
      transclude: true,
      templateUrl: function(tElement, tAttrs) {
        return tAttrs.templateUrl || 'template/modal/window.html';
      },
    

    and the template sourcecode - window.html:

    <div tabindex="-1" role="dialog" class="modal fade" ng-class="{in: animate}" ng-style="{'z-index': 1050 + index*10, display: 'block'}" ng-click="close($event)">
    <div class="modal-dialog" ng-class="{'modal-sm': size == 'sm', 'modal-lg': size == 'lg'}"><div class="modal-content" modal-transclude></div></div>
    

    there is a directive modal-transclude,your dialog content will insert into it, it's sourcecode:

    .directive('modalTransclude', function () {
    return {
      link: function($scope, $element, $attrs, controller, $transclude) {
        $transclude($scope.$parent, function(clone) {
          $element.empty();
          $element.append(clone);
        });
      }
    };
    

    })

    now take a look at offical doc of $compile:

    Transclusion Functions
    
    When a directive requests transclusion, the compiler extracts its contents and provides 
    a transclusion function to the directive's link function and controller. 
    This transclusion function is a special linking function that will return the compiled 
    contents linked to a **new transclusion scope.**
    

    transclude will create a new scope of controller scope

    0 讨论(0)
提交回复
热议问题