2017-08-03 29 views
0

我有一个奇怪的场景,我的数据在模态窗口打开后即被更新。我应该通过在模态弹出窗口中添加一个新项目来刷新模态弹出窗口中的数据。 这里是蹲跳者,我试图通过$rootScope,但从文档中,意识到默认范围通过是$rootScope。 我plunker链接 https://plnkr.co/edit/hnMGHfsxPfq8BRCtVxqJ

我采用了棱角分明的UI引导和利用$uibModal 请提出一个解决方案,我可以试试。 在我的plunker代码中,即使$ item被更新,我的模式也不会被刷新。

<!doctype html> 
<html ng-app="ui.bootstrap.demo"> 
    <head> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-animate.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.6.1/angular-sanitize.js"></script> 
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-2.5.0.js"></script> 
    <script src="example.js"></script> 
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
    </head> 
    <body> 
<div ng-controller="ModalDemoCtrl as $ctrl" class="modal-demo"> 
    <script type="text/ng-template" id="myModalContent.html"> 
     <div class="modal-header"> 
      <h3 class="modal-title" id="modal-title">I'm a modal!</h3> 
     </div> 
     <div class="modal-body" id="modal-body"> 
      <ul> 
       <li ng-repeat="item in $ctrl.items"> 
        <a href="#" ng-click="$event.preventDefault(); $ctrl.selected.item = item">{{ item }}</a> 
       </li> 
      </ul> 
      Selected: <b>{{ $ctrl.selected.item }}</b> 
     </div> 
     <div class="modal-footer"> 
      <button class="btn btn-primary" type="button" ng-click="$ctrl.ok()">OK</button> 
      <button class="btn btn-warning" type="button" ng-click="$ctrl.cancel()">Cancel</button> 
     </div> 
    </script> 
    <script type="text/ng-template" id="stackedModal.html"> 
     <div class="modal-header"> 
      <h3 class="modal-title" id="modal-title-{{name}}">The {{name}} modal!</h3> 
     </div> 
     <div class="modal-body" id="modal-body-{{name}}"> 
      Having multiple modals open at once is probably bad UX but it's technically possible. 
     </div> 
    </script> 

    <button type="button" class="btn btn-default" ng-click="$ctrl.open()">Open me!</button> 
    <button type="button" class="btn btn-default" ng-click="$ctrl.additems()">Add Item</button> 
    {{ $ctrl.items}} 
    <div class="modal-parent"> 
    </div> 
</div> 
    </body> 
</html> 
    angular.module('ui.bootstrap.demo', ['ngAnimate', 'ngSanitize', 'ui.bootstrap']); 
angular.module('ui.bootstrap.demo').controller('ModalDemoCtrl', function ($uibModal, $log, $document) { 
    var $ctrl = this; 
    $ctrl.items = ['item1', 'item2', 'item3']; 

    $ctrl.animationsEnabled = true; 
    $ctrl.additems = function(){ 
    $ctrl.items.push("item"+($ctrl.items.length+1)); 

    }; 
    $ctrl.open = function (size, parentSelector) { 
    var parentElem = parentSelector ? 
     angular.element($document[0].querySelector('.modal-demo ' + parentSelector)) : undefined; 
    var modalInstance = $uibModal.open({ 
     animation: $ctrl.animationsEnabled, 
     ariaLabelledBy: 'modal-title', 
     ariaDescribedBy: 'modal-body', 
     templateUrl: 'myModalContent.html', 
     controller: 'ModalInstanceCtrl', 
     controllerAs: '$ctrl', 
     size: size, 
     appendTo: parentElem, 
     resolve: { 
     items: function() { 
      return $ctrl.items; 
     } 
     } 
    }); 
    setTimeout(function() { 

      $ctrl.items.push("item"+($ctrl.items.length+1)); 
     }, 1000); 

    modalInstance.result.then(function (selectedItem) { 
     $ctrl.selected = selectedItem; 
    }, function() { 
     $log.info('Modal dismissed at: ' + new Date()); 
    }); 
    }; 



    $ctrl.toggleAnimation = function() { 
    $ctrl.animationsEnabled = !$ctrl.animationsEnabled; 
    }; 
}); 

// Please note that $uibModalInstance represents a modal window (instance) dependency. 
// It is not the same as the $uibModal service used above. 

angular.module('ui.bootstrap.demo').controller('ModalInstanceCtrl', function ($uibModalInstance, items) { 
    var $ctrl = this; 
    $ctrl.items = items; 
    $ctrl.selected = { 
    item: $ctrl.items[0] 
    }; 

    $ctrl.ok = function() { 
    $uibModalInstance.close($ctrl.selected.item); 
    }; 

    $ctrl.cancel = function() { 
    $uibModalInstance.dismiss('cancel'); 
    }; 
}); 

我的问题特别是在这里,模态与传递项目已经呈现。 ctrl.items在1秒后更新,但传递项目的模式窗口未更新。有没有一种方法,我可以送$ ctrl.items的更新模式窗口

setTimeout(function() { 
        $ctrl.items.push("item"+($ctrl.items.length+1)); 
     }, 1000); 
+0

请在问题本身有更详细的问题描述以及相关的代码。演示很棒,但只能用于支持问题中实际存在的内容。人们不应该离开现场只是审查你的问题的基础 – charlietfl

回答

0

你的问题不是很清楚。从你的plunkr中,我发现当原始数据被修改时,模态数据会得到更新。所以,假设这是你的问题:Javascripts对象被引用复制。所以为了避免这种情况,你需要创建一个对象的新副本。像这样:

items: function() { 
      return angular.copy($ctrl.items); 
     } 

更新plunkr:https://plnkr.co/edit/pHDr0B0jWRBGeNSPu0t7?p=preview

+0

我道歉,真正的事实是,如果我更新根上的项目,我想模式上的项目被更新,但它不是发生并试图找出一种方法来发布来自根目录的更新。 –

+0

发生了。当你打开模式时,点击一些项目,你会看到范围得到更新。你需要强制应用() – yBrodsky

+0

是的,谢谢指出,我所做的问题是,我发送项目到我的模态控制器,但我将“items”集合映射到另一个对象。所以,即使我应用这些更改,我的UI也没有更新。感谢您指点我正确的方向 –