2017-08-03 38 views
0

私はモーダルウィンドウを開いた後でもデータが更新されるという特別なシナリオがあります。モーダルポップアップに新しい項目を追加することで、モーダルポップアップのデータを更新するはずです。 ここでは、私は$rootScopeを渡そうとしましたが、ドキュメントからは、渡されたデフォルトスコープが$rootScopeであることに気付きました。 マイplunkerリンクは https://plnkr.co/edit/hnMGHfsxPfq8BRCtVxqJ

である私は、角のUIブートストラップを使用して$uibModal を使用しています私は試みることができるソリューションを提案してください。 私のプランナーコードでは、$ 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'); 
    }; 
}); 

私の問題は具体的には、Modalはすでにアイテムが渡されてレンダリングされています。 ctrl.itemsは1秒後に更新されますが、アイテムが渡されるモーダルウィンドウは更新されません。私は

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

は、より詳細な問題の説明と一緒に、質問自体に関連するコードを記載してください。デモは素晴らしいですが、質問に実際に存在するものをサポートするためにのみ使用する必要があります。人々はサイトから外に出る必要はありません。あなたの問題の基本を確認するだけです。 – charlietfl

答えて

0

あなたの質問は非常に明確ではなかったウィンドウをモーダル$ ctrl.itemsの更新を送ることができる方法はあります。 plunkrから、元のデータが変更されたときにモーダルデータが更新されることがわかります。だから、あなたの問題だと仮定すると、Javascriptオブジェクトは参照によってコピーされます。そのため、オブジェクトの新しいコピーを作成する必要があります。これと同じように:

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

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

+0

私は謝罪します。実際には、私がroot上のアイテムを更新すると、モーダル上のアイテムを更新したいのですが、ルートからアイテムの更新を発行する方法を理解しようとしています。 –

+0

それは起こっている。モーダルを開いたら、いくつかの項目をクリックすると、スコープが更新されるのがわかります。 – yBrodsky

+0

はい、指摘してくれてありがとう、私がやっていた問題は、私がモーダルコントローラにアイテムを送ったのですが、私は "アイテム"コレクションを別のオブジェクトにマップしています。だから、たとえ私が変更を適用しても、私のUIは更新されていませんでした。私に正しい方向を指してくれてありがとう –

関連する問題