AngularJS: Як перемикати погляди з функції контролера?


237

Я намагаюся використовувати функцію ng click AngularJS для перемикання поглядів. Як би я зробив це з кодом нижче?

index.html

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

controller.js

  function Cntrl ($scope) {
        $scope.someFunction = function(){
            //code to change view?
        }
    }

Відповіді:


314

Щоб переключитися між різними поданнями, ви можете безпосередньо змінити window.location (за допомогою служби $ location!) У файлі index.html

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

Controller.js

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

і налаштувати маршрутизатор для переключення на різні партії залежно від місця розташування (як показано тут https://github.com/angular/angular-seed/blob/master/app/app.js ). Це матиме перевагу історії, а також використання ng-view.

Крім того, ви використовуєте ng-include з різними частками, а потім використовуєте ng-перемикач, як показано тут ( https://github.com/ganarajpr/Angular-UI-Components/blob/master/index.html )


Я отримую помилку, яка говорить, що хеш - це не функція $ location.
The_Brink

Я не бачу хеш як частина об’єкта $ location, але є хеш-змінна $$, так що це, і якщо так, він не працює.
The_Brink

Гаразд, я дізнався, як це зробити. $ location.path (вид); ( docs.angularjs.org/guide/dev_guide.services.$location )
The_Brink

@The_Brink Дякую за редагування Я не знаю, чому це було відхилено. Я вніс зміни, щоб відобразити те, що я намагався сказати.
ganaraj

2
Найкраще, що насправді потрібно зробити, це просто зробити нормальне посилання. <a href="https://stackoverflow.com/edit">Edit</a> Кутовий переконається, що клацання не створить перезавантаження сторінки. Цю поведінку можна модифікувати так, що вона запускає перезавантаження, якщо цього потрібно.
Ентоні Мартін

38

Надана відповідь абсолютно правильна, але я хотів розширити для будь-яких майбутніх відвідувачів, які, можливо, захочуть це зробити трохи динамічніше -

На виду -

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

У контролері -

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

Та сама основна концепція, що і прийнята відповідь, просто додавши до неї якийсь динамічний контент, щоб трохи покращити. Якщо прийнята відповідь хоче додати це, я видалю свою відповідь.


8
загальна нитка, але FYI, a url- це фактично повна веб-адреса, включаючи протокол (http: //) і все. Як мається на увазі $location.path()ваша змінна, краще описується як path.
Зах Лісобей

Але для цього потрібен $ rootScope. $ Digest (); або $ область. $ apply (); аби змусити його без зволікань рухатися.
Раз

23

У мене приклад працює.

Ось як виглядає мій документ:

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

Ось як виглядає моя часткова:

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

Ось як виглядає мій Ctrl:

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

додаток - мій модуль:

var app = angular.module('app', ['ngResource']).config(function($routeProvider)...

Сподіваюся, це корисно!


12

Метод, який використовується для всіх попередніх відповідей на це питання, пропонує змінити URL-адресу, що не є необхідним, і я думаю, що читачі повинні знати про альтернативне рішення. Я використовую ui-роутер і $ stateProvider, щоб пов’язати значення стану з templateUrl, який вказує на файл html для вашого перегляду. Тоді лише питання введення $ state у свій контролер та виклик $ state.go ('state-value') для оновлення вашого перегляду.

Яка різниця між кутом маршрутизатора та angular-ui-router?


5

Для цього є два способи:

Якщо ви використовуєте ui-роутер або $stateProviderзробіть це так:

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

якщо ви використовуєте кутовий маршрутизатор або $routeProviderзробіть це так:

$location.path('routeName'); //similarily include $location service in your controller

У тому, що мене наштовхнуло на те, щоб використовувати назву маршруту замість назви штату ... тобто це повинно бути "головним" замість "/ головного"
Бен Шмідт

3

Не роблячи повного оновлення середовища (# / ViewName) маршрутизації за замовчуванням, я зміг зробити невелику модифікацію підказки Коді, і він працював чудово.

контролер

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

вид

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

Що мене наштовхнуло на це рішення, коли я намагався інтегрувати віджет Kendo Mobile UI у кутове середовище, я втрачав контекст мого контролера, а поведінка звичайного тега якоря також була викрадена. Я відновив свій контекст у віджеті Kendo і мені потрібно було використовувати метод для навігації ... це спрацювало.

Дякуємо за попередні повідомлення!


2
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'); 

Сподіваюся, що це вам допоможе


2

Ця маленька функція мені добре послужила:

    //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;
        }


    };

Вам не потрібен повний шлях, просто вид, на який ви переходите

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.