2016-06-01 8 views
0

Ich habe eigentlich drei Ausgaben mit $ canActivate Zugriff (auch Code schauen unten besser, um die Probleme zu verstehen):

  1. Beim Anklicken <a ng-link="['MachineDetails', { id: 'c6bd76947fc0' }]</a> ich kann nicht auf die ID von $ canActivate (url und Strecke noch nicht so chnaged kann es nicht entweder durch eine inject $ Lage oder injiziert $ rootRouter bekommen)
  2. ich kann nicht einen Weg finden, um Daten von $ passieren canActivate zu Controller.
  3. Ich kann nicht von $ canActivate (mit $ rootRouter.navigate()) umleiten.

    import template from './machine-details.html'; 
    
    export const machineDetailsComponent = { 
        template: template, 
        controller: machineDetailsController, 
        $canActivate: canActivate, 
    }; 
    
    /*@ngInject*/ 
    function machineDetailsController (machineDetailsService) { 
        this.$routerOnActivate = function (nextRoute) { 
         // do something; 
        }; 
    } 
    
    /*@ngInject*/ 
    function canActivate ($q, $rootRouter, machineDetailsService) { 
        const deferred = $q.defer(); 
        /** 
        * ISSUE 1: 
        * if I get here via ng-link, then $rootRouter.lastNavigationAttempt 
        * shows the route I was on when clicking, however if I type the url manually 
        * (or refresh) I get something I can use which is for example '/machineDetails/c6bd76947fc01' 
        **/ 
        const machineId = $rootRouter.lastNavigationAttempt.split('/')[2]; 
    
        machineDetailsService.getMachineDetailsData(machineId) 
         .then(successHandler, errorHandler); 
    
        /**   
        * ISSUE 2: 
        * 'result' does not make its way into controller so I need to call 
        * machineDetailsService.getMachineDetailsData again in controller... 
        **/ 
        function successHandler (result) { 
         deferred.resolve(); // passing on result has no affect 
        } 
    
        function errorHandler (error) { 
         deferred.resolve(error); 
         /** 
         * ISSUE 3: 
         * $rootRouter.navigate doesn't work here (and controller is 
         * never called) so how do I cause system to go back to list view ? 
         **/ 
         // $rootRouter.navigate(['ListView']); 
        } 
    
        return deferred.promise; 
    } 
    

    Der obige Code ist meine Komponentendefinition in ES6 geschrieben.

Antwort

0
  1. Sie $nextInstruction in Ihrem $canActivate Haken injizieren und dann können Sie Ihre params über $nextInstruction.params zugreifen.

    function canActivate($nextInstruction, $q, $rootRouter, machineDetailsService) { 
        const machineId = $nextInstruction.params.id; 
    } 
    
  2. Ich lief in das gleiche Problem, konnte aber keine Lösung nicht finden Daten aus dem $canActivate Haken in die Steuerung zu übergeben.

  3. Sie können zu ListView über $rootRouter.navigate(['/ListView']) navigieren. Beachten Sie den Schrägstrich. Das muss angegeben werden, da ListView keine untergeordnete Route ist.

+0

Re # 2 fand ich einen Weg, es zu tun, aber es fühlt sich hacky: sowohl die Steuerung und canActivate Zugang zu machineDetailsComponent hat (die Komponente Definitionsobjekt), so dass kann als gemeinsam genutzter Umfang verwendet werden .. . – yar1

Verwandte Themen