42


Haupteintragsseite hat Bearbeitungsschaltfläche. Welche Details der bearbeiteten Zeile öffnet.
Way-1: Nun, wenn ich "ctrl.parent.q_details.client_location" festlegen, ist es Bindung mit übergeordneten Auflistungscontroller und es funktioniert als 2-Wege-Bindung und ändert automatisch die Werte wie im Bearbeitungsfeld Änderungen, die ist hier nicht erforderlich.
Hier möchte ich nur Werte in Eingabefeld anzeigen und zulassen. Ich möchte nicht im übergeordneten Controller geändert werden.
Übergeben von Daten an mdDialog

► Im Anschluss wird der Code in geordneten Controller mdDialog nennen

$mdDialog.show({ 
       locals:{parent: $scope},     
       clickOutsideToClose: true,     
       controllerAs: 'ctrl',     
       templateUrl: 'quotation/edit/',//+edit_id, 
       controller: function() { this.parent = $scope; }, 
      }); 

► Code des Popup mdDialog folgt.

<md-dialog aria-label=""> 
    <div ng-app="inputBasicDemo" ng-controller="deliverController" layout="column"> 
     <form name="" class="internal_note_cont">   
      <md-content class="md-padding">    
       <md-input-container class="md-input-has-value" flex> 
        <label>Client Name</label> 
        <input ng-model="qe.client_name" required > 
       </md-input-container> 
       <md-input-container flex> 
        <label>Client Location</label> 
        <input required ng-model="ctrl.parent.q_details.client_location"> 
       </md-input-container>     
      </md-content> 
     </form> 
     <div>   
     </div> 
    </div> 
    <input type="" required ng-model="ctrl.parent.q_details.recid"> 
</md-dialog> 



WAY2: zweite Möglichkeit, den Wert direkt aus DB sendet, ohne die Bindung an ng-Modell des Dialog-Controller (deliverController).

]).controller("deliverController", ["$scope", "$filter","$http","$route","$window","$mdDialog", 
    function ($scope, $filter,$http,$route,$window,$mdDialog) { 
     $scope.qe.client_name = '12345'; // just to test.   
    } 

Dies wird geben Fehler von undefine $ scope.qe.

Also letztlich, ich bin nicht in der Lage, Daten an MDDialogue zu senden und sie anzuzeigen und bearbeiten sie wie üblich. Bitte jemand eckigen Kerl helfen mir helfen. Ich bin neu in eckigen. Ich versuche seit 2 Tagen verschiedene Wege.

+1

Sie können ng-bind verwenden, um eine einmalige Bindung einzurichten. Sie könnten auch einen Dienst verwenden, um Daten zwischen dem übergeordneten und untergeordneten Element zu übertragen. – BobDoleForPresident

+0

Haben Sie versucht mit 'preserveScope: true'? – Ellone

Antwort

70

Dieser Kerl hat immer die richtige Antwort: https://github.com/angular/material/issues/455#issuecomment-59889129

Kurz:

$mdDialog.show({ 
      locals:{dataToPass: $scope.parentScopeData},     
      clickOutsideToClose: true,     
      controllerAs: 'ctrl',     
      templateUrl: 'quotation/edit/',//+edit_id, 
      controller: mdDialogCtrl, 
     }); 

var mdDialogCtrl = function ($scope, dataToPass) { 
    $scope.mdDialogData = dataToPass 
} 

die Variable übergeben mit den Einheimischen in Gang Objekt zuzuschreiben. Diese Werte werden in den Controller und nicht in den $ scope eingegeben. Auch die Weitergabe des gesamten $ Scope des Elternteils ist vielleicht keine so gute Idee, da sie das isolierte Scope-Paradigma vereitelt.

+1

Wenn mdDialogData in mdDialogCtrl geändert wird, wird die Änderung in $ scope.parentScopeData reflektiert? Ich habe einen Anwendungsfall, der ein Objekt des aktuellen Bereichs an mdDialogCtrl übergeben muss, und die Änderungen an diesem Objekt in mdDialogCtrl sollten außerhalb des Gültigkeitsbereichs abgefangen werden. Vielen Dank! –

+1

Ja, es reflektiert, wenn Sie eine Objektreferenz über die Einheimischen übergeben, spiegelt es, obwohl ich erwarten würde, dass es isoliert und nicht ändern die übergeordneten Daten direkt, seltsam ..! – Basav

+0

Irgendeine Idee, wie man das macht, ohne $ scope zu benutzen? –

4

HTML

<md-button ng-click='vmInter.showDialog($event,_dataToPass)'> 
<i class="fa fa-custom-edit" aria-hidden="true"></i> 
</md-button> 

Js

function _showSiebelDialog(event,_dataToPass) { 

     $mdDialog.show({ 
       locals:{dataToPass: _dataToPass}, //here where we pass our data 
       controller: _DialogController, 
       controllerAs: 'vd', 
       templateUrl: 'contentComponents/prepare/views/Dialog.tmpl.html', 
       parent: angular.element(document.body), 
       targetEvent: event, 
       clickOutsideToClose: true 

      }) 
      .then(
       function(answer) {}, 
       function() { 

       } 
      ); 
    }; 

function _DialogController($scope, $mdDialog,dataToPass) { 
console.log('>>>>>>> '+dataToPass); 
} 
1
$scope.showPrompt = function(yourObject) { 
$mdDialog.show({ 
    templateUrl: 'app/views/your-dialog.tpl.html', 
    locals: { 
     callback: $scope.yourFunction // create the function $scope.yourFunction = function (yourVariable) { 
    }, 
    controller: function ($scope, $mdDialog, callback) { 
     $scope.dialog.title = 'Your title'; 
     $scope.dialog.abort = function() { 
      $mdDialog.hide(); 
     }; 
     $scope.dialog.hide = function() { 

      if ($scope.Dialog.$valid){ 
       $mdDialog.hide(); 
       callback($scope.yourReturnValue, likes the return of input field); 
      } 
     }; 
    }, 
    controllerAs: 'dialog', 
    bindToController: true, 
    clickOutsideToClose: true, 
    escapeToClose: true 
}); 

};

0

Das ES6 TL; DR Weg

on the fly mit Rahmen Variablen einen Controller erstellen

let showDialog = (spaceApe) => { 
    $mdDialog.show({ 
     templateUrl: 'dialog.template.html', 
     controller: $scope => $scope.spaceApe = spaceApe 
    }) 
} 

Vorlage

Voilà, kann spaceApe nun in der Dialogvorlage verwendet werden

<md-dialog> 
    <md-dialog-content> 
     <span> {{spaceApe | json}} </span> 
    <md-dialog-content> 
<md-dialog> 
Verwandte Themen