Transmission de données à mdDialog


La page principale de la liste a le bouton Modifier. Qui ouvre les détails de la ligne éditée.
Moyen-1: Maintenant, si j'ai mis "ctrl.parent.q_details.client_location " il est lié avec le contrôleur de liste parent et il fonctionne comme une liaison à 2 voies et modifie automatiquement les valeurs comme dans les modifications de la boîte d'édition, ce qui n'est pas obligatoire ici.
Ici, je veux juste afficher et autoriser les valeurs d'édition dans inputbox. Je ne veux pas être changé dans le contrôleur parent.

► Voici le code dans parent contrôleur pour appeler mdDialog

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

► Voici le code du popup mdDialog.

<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: la deuxième façon est d'envoyer la valeur directement à partir de DB sans se lier à ng-model of 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.        
    }

Cela donne une erreur de undefine $ scope.qe .

donc, en fin de Compte, Je ne suis pas en mesure d'envoyer des données à mdDialogue et de les afficher et de permettre de les modifier comme d'habitude. Veuillez quelqu'un d'expérimenté angulaire gars m'aider. Je suis nouveau angulaire. J'essaie de différentes façons depuis 2 jours.

47
demandé sur isherwood 2015-07-06 11:13:32

5 réponses

Ce mec a toujours la bonne réponse: https://github.com/angular/material/issues/455#issuecomment-59889129

En bref:

$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  
}

Passez la variable en utilisant l'attribut locals dans l'objet passant. Ces valeurs seront injectées dans le contrôleur pas dans $scope . Passer également toute la portée $du parent pourrait ne pas être une bonne idée car cela défait le paradigme de portée isolée.

81
répondu pascalwhoop 2018-04-23 15:15:04

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);
}
5
répondu BERGUIGA Mohamed Amine 2016-06-08 08:52:06
$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
});

};

1
répondu Jea 2017-03-03 11:58:04

Le ES6 TL; DR façon

Créer un contrôleur avec des variables de portée à la volée

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

Le Modèle

Voilà, spaceApe peut maintenant être utilisé dans le modèle de dialogue

<md-dialog>
    <md-dialog-content>
        <span> {{spaceApe | json}} </span>
    <md-dialog-content>
<md-dialog>
1
répondu DotBot 2017-08-25 23:39:27

Cela a fonctionné pour moi:

        confirmNewData = function() {
        let self = this;
        this.$mdDialog.show({                
            templateUrl: '/dist/views/app/dialogConfirmAFEData.html',
            controllerAs: "ctrl",                                
            controller: $scope => $scope = { $mdDialog: self.$mdDialog, 
                                             data: self.FMEData, 
                                             cancel: function() { this.$mdDialog.cancel(); }, 
                                             confirm: function() { this.$mdDialog.hide(); }  
                                           },
            clickOutsideToClose: false
        }).then(function() {
            // User Accepted!!
            console.log('You accepted!!!');
        }, function() {
            // User cancelled, don't do anything.
            console.log('You cancelled!!!');
        });
    };

Et dans la vue...

<md-dialog aria-label="Start New AFE" style="min-width: 50%;">
    <md-toolbar>
      <div class="md-toolbar-tools">
        <h2>GIS Data...</h2>          
      </div>
    </md-toolbar>
    <md-dialog-content>
        <div layout="column" layout-padding>
            <li/>Lease: {{ ctrl.data.LEASE }}    
            <li/>Reservoir: {{ ctrl.data.RESERVOIR }}    
        </div>
    </md-dialog-content>

    <md-dialog-actions layout="row">
      <md-button class="md-button" ng-click="ctrl.cancel()">Cancel</md-button>
      <md-button class="md-button" ng-click="ctrl.confirm()">Yes</md-button>                
    </md-dialog-actions>

0
répondu Danmar Herholdt 2018-03-23 15:21:15