AngularJS: jak przełączać widoki z funkcji kontrolera?

Próbuję użyć ng-click funkcji AngularJS do przełączania widoków. Jak mam to zrobić z poniższym kodem?

Indeks.html

 <div ng-controller="Cntrl">
        <div ng-click="someFunction()">
            click me
        <div>
    <div>

Kontroler.js

  function Cntrl ($scope) {
        $scope.someFunction = function(){
            //code to change view?
        }
    }
Author: Damjan Pavlica, 2012-06-12

8 answers

Aby przełączać się między różnymi widokami, możesz bezpośrednio zmienić okno.lokalizacja (za pomocą usługi $location!) w indeks.plik html

<div ng-controller="Cntrl">
        <div ng-click="changeView('edit')">
            edit
        </div>
        <div ng-click="changeView('preview')">
            preview
        </div>
</div>

Kontroler.js

function Cntrl ($scope,$location) {
        $scope.changeView = function(view){
            $location.path(view); // path not hash
        }
    }

I skonfigurować router tak, aby przełączał się na różne częściowe w zależności od lokalizacji ( jak pokazano tutaj https://github.com/angular/angular-seed/blob/master/app/app.js ). Byłoby to korzystne zarówno dla historii, jak i dla ng-view.

Alternatywnie, używasz ng-include z różnymi częściowe, a następnie użyć ng-switch jak pokazano tutaj ( https://github.com/ganarajpr/Angular-UI-Components/blob/master/index.html )

 308
Author: ganaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 10:53:10

Udzielona odpowiedź jest absolutnie poprawna, ale chciałem rozszerzyć ją dla przyszłych odwiedzających, którzy mogą chcieć zrobić to nieco bardziej dynamicznie -

W widoku -

<div ng-repeat="person in persons">
    <div ng-click="changeView(person)">
        Go to edit
    <div>
<div>

W kontrolerze -

$scope.changeView = function(person){
    var earl = '/editperson/' + person.id;
    $location.path(earl);
}

Ta sama podstawowa koncepcja, co przyjęta odpowiedź, po prostu dodając do niej dynamiczną treść, aby nieco poprawić. Jeśli zaakceptowana odpowiedź chce to dodać, usunę swoją odpowiedź.

 38
Author: PW Kad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-28 02:48:19

Mam działający przykład.

Oto jak wygląda mój doktor:

<html>
<head>
    <link rel="stylesheet" href="css/main.css">
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular-resource.min.js"></script>
    <script src="js/app.js"></script>
    <script src="controllers/ctrls.js"></script>
</head>
<body ng-app="app">
    <div id="contnr">
        <ng-view></ng-view>
    </div>
</body>
</html>

Oto jak wygląda moja część:

<div id="welcome" ng-controller="Index">
    <b>Welcome! Please Login!</b>
    <form ng-submit="auth()">
        <input class="input login username" type="text" placeholder="username" /><br>
        <input class="input login password" type="password" placeholder="password" /><br>
        <input class="input login submit" type="submit" placeholder="login!" />
    </form>
</div>

Oto jak wygląda mój Ctrl:

app.controller('Index', function($scope, $routeParams, $location){
    $scope.auth = function(){
        $location.url('/map');
    };
});

Aplikacja jest moim modułem:

var app = angular.module('app', ['ngResource']).config(function($routeProvider)...
Mam nadzieję, że to pomoże!
 23
Author: Cody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-20 19:03:29

Metoda zastosowana we wszystkich poprzednich odpowiedziach na to pytanie sugeruje zmianę adresu url, która nie jest konieczna i myślę, że czytelnicy powinni być świadomi alternatywnego rozwiązania. Używam ui-router i $stateProvider do powiązania wartości stanu z templateUrl, który wskazuje na plik html dla widoku. Wtedy jest to tylko kwestia wtrysku $state do kontrolera i wywołania $state.przejdź ('state-value'), aby zaktualizować widok.

Jaka jest różnica między drogą kątową a angular-ui-router?

 12
Author: Gavin Palmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

Są na to dwa sposoby:

Jeśli używasz ui-routera lub $stateProvider, Zrób to jako:

$state.go('stateName'); //remember to add $state service in the controller

Jeśli używasz angular-router lub $routeProvider, Zrób to tak:

$location.path('routeName'); //similarily include $location service in your controller
 5
Author: Sukhminder Parmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-12 04:53:11

Nie robiąc pełnej zmiany domyślnego środowiska routingu (#/ViewName), udało mi się zrobić niewielką modyfikację końcówki Cody ' ego i sprawiło, że działa świetnie.

Kontroler

.controller('GeneralCtrl', ['$route', '$routeParams', '$location',
        function($route, $routeParams, $location) {
            ...
            this.goToView = function(viewName){
                $location.url('/' + viewName);
            }
        }]
    );

Widok

...
<li ng-click="general.goToView('Home')">HOME</li>
...

Co doprowadziło mnie do tego rozwiązania, gdy próbowałem zintegrować Kendo Mobile UI widget do kątowego środowiska traciłem kontekst mojego kontrolera i zachowanie zwykłego znacznika kotwicy również został porwany. Przywróciłem swój kontekst z poziomu widżetu Kendo i musiał użyć metody nawigacji...to zadziałało.

Dzięki za poprzednie posty!

 3
Author: beauXjames,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 19:03:10
Firstly you have to create state in app.js as below

.state('login', {
      url: '/',
      templateUrl: 'views/login.html',
      controller: 'LoginCtrl'
    })

and use below code in controller

 $location.path('login'); 

Mam nadzieję, że to ci pomoże

 2
Author: Vaishali Tekale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-21 09:43:16

Ta mała funkcja dobrze mi służyła:

    //goto view:
    //useage -  $scope.gotoView("your/path/here", boolean_open_in_new_window)
    $scope.gotoView = function (st_view, is_newWindow)
    {

        console.log('going to view: ' + '#/' + st_view, $window.location);
        if (is_newWindow)
        {
            $window.open($window.location.origin + $window.location.pathname + '' + '#/' + st_view, '_blank');
        }
        else
        {
            $window.location.hash = '#/' + st_view;
        }


    };

Nie potrzebujesz pełnej ścieżki, tylko Widok, na który się przełączasz

 2
Author: Shawn Dotey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 20:47:20