2014-02-08 15 views
24

Ich benutze angular-UI-Router und angular-Bootstrap in meinem Projekt.Angular UI-Router öffnen modales Fenster auf URL ändern

Ich will follow Anwendungsfall implementieren:

Wenn Benutzer klicken Sie auf „Bearbeiten“ klicken, UI-Router ändern URL und offenen modale Fenster. Wenn ich zurück gehe, indem ich auf den Zurück-Knopf des Browsers klicke, schließt sich das modale Fenster.

Wenn der Benutzer die Seite neu lädt, wenn das modale Fenster geöffnet wird, sollte die Anwendung den modalen Fensterinhalt im Haupt-UI-View-Container darstellen.

Dieser Anwendungsfall können Sie auf diesem Vater sehen: http://canopy.co/ (anprobieren Artikel klicken und lädt Seite)

Frage: Wie oben beschriebenes Verhalten implementieren?

Hier ist meine jsFiddle http://jsfiddle.net/sloot/ceWqw/3/

var app = angular.module('myApp', ['ui.router', 'ui.bootstrap']) 
.config(function ($stateProvider, $urlRouterProvider) { 

    $urlRouterProvider.otherwise('/'); 
    $stateProvider 
    .state('app', { 
     url: '/', 
     controller: 'AppCtrl', 
     templateUrl: '/views/app.html' 
    }) 
    .state('item', { 
     url: '/profile', 
     controller: 'ItemCtrl', 
     templateUrl: '/views/item.html' 
    }); 
}) 
.controller('AppCtrl', function($scope, $modal, $state){ 
    $scope.open = function(){ 

    // open modal whithout changing url 
    $modal.open({ 
     templateUrl: '/views/item.html' 
    }); 

    // I need to open popup via $state.go or something like this 
    }; 
}) 
.controller('ItemCtrl', function(){}); 

Antwort

0

Hier ist ein Problem auf UI-Routers Github beschreiben, was Sie zu tun versuchen:

State transitions similar to Pinterest's overlay

Sie können die Implementierung in dieser reply sehen . Beachten Sie, dass die Art und Weise, wie sie den gewünschten Effekt erzielt haben, in der neuesten Version gepatcht wurde und sie eine ältere Version des UI-Routers verwenden, um die Funktionalität beizubehalten.

+0

Als ich 'prevent' Funktion für '$ stateChangeStart' Ereignis, ui-Router nicht url verwenden ändern. Kennen Sie die Lösung für die Änderungs-URL und verhindern das Rendern von Ansichten? –

19

Es gibt ein großartiges Beispiel hier auf den ui-router FAQs. Der Schlüssel verwendet den onEnter-Parameter.

https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-open-a-dialogmodal-at-a-certain-state

Hier ist ein Beispiel dafür ui-Bootstrap-modalen Service $ zu tun verwenden. In diesem Beispiel wird nur eine onEnter-Funktion angegeben. Es gibt keine Vorlage, Controller usw. Im Wesentlichen wird das Modal angezeigt, und wenn es geschlossen ist, kehrt es zum Status der Elemente zurück. Sie sind immer noch dafür verantwortlich, mit dem Zustand umzugehen, in den Ihre App beim Schließen des Modals übergeht.

$stateProvider.state("items.add", { 
    url: "/add", 
    onEnter: function($stateParams, $state, $modal, $resource) { 
     $modal.open({ 
      templateUrl: "items/add", 
      resolve: { 
       item: function() { new Item(123).get(); } 
      }, 
      controller: ['$scope', 'item', function($scope, item) { 
       $scope.dismiss = function() { 
       $scope.$dismiss(); 
       }; 

       $scope.save = function() { 
       item.update().then(function() { 
        $scope.$close(true); 
       }); 
       }; 
      }] 
     }).result.finally(function() { 
      $state.go('^'); 
     }); 
    } 
}); 
+0

Das funktioniert großartig, aber ich sehe ein Problem. Wenn ich irgendwo auf ein dunkles Overlay um das $ modal klicke, schließt es sich selbst, aber es erzeugt kein Event, so dass der Zustand gleich bleibt. Irgendeine Idee, wie man das repariert? – Episodex

+4

Antwort gefunden von mir. Sie sollten einen zweiten Funktionsrückruf in 'then' einfügen (separate Rückrufe durch Komma). Diese zweite Funktion wird bei 'follow' gestartet und auch wenn Modal durch Drücken von Esc oder Klicken auf Overlay geschlossen wird. – Episodex

+0

BTW, wurde es aktualisiert, um schließlich anstelle von dann in den FAQ zu verwenden, die Sie verknüpften. –

Verwandte Themen