AngularJS: как переключить представления из функции контроллера?
Я пытаюсь использовать ng-click функция AngularJS для переключения видов. Как бы я сделал это с помощью кода ниже?
.HTML-код <div ng-controller="Cntrl">
<div ng-click="someFunction()">
click me
<div>
<div>
контроллер.js
function Cntrl ($scope) {
$scope.someFunction = function(){
//code to change view?
}
}
8 ответов:
для того, чтобы переключаться между различными видами, вы можете непосредственно изменить окно.расположение (с помощью сервиса $location!) в индекс.html файл
<div ng-controller="Cntrl"> <div ng-click="changeView('edit')"> edit </div> <div ng-click="changeView('preview')"> preview </div> </div>
контроллер.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)
предоставленный ответ абсолютно правильный, но я хотел бы расширить для любых будущих посетителей, которые могут захотеть сделать это немного более динамично -
в поле зрения -
<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); }
та же основная концепция, что и принятый ответ, просто добавив к нему динамический контент, чтобы немного улучшить. Если принятый ответ хочет добавить это, я удалю свой ответ.
у меня есть пример работы.
вот как выглядит мой док:
<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)...
надеюсь, что это полезно!
метод, используемый для всех предыдущих ответов на этот вопрос, предлагает изменить url-адрес, который не является необходимым, и я думаю, что читатели должны знать об альтернативном решении. Я использую ui-router и $stateProvider, чтобы связать значение состояния с templateUrl, которое указывает на html-файл для вашего представления. Тогда это просто вопрос введения $state в ваш контроллер и вызова $state.перейти ('state-value'), чтобы обновить представление.
в чем разница между угловые маршрута и угловой пользовательского интерфейса маршрутизатора?
есть два способа для этого:
если вы используете ui-router или
$stateProvider
в:$state.go('stateName'); //remember to add $state service in the controller
если вы используете угловой маршрутизатор или
$routeProvider
в:$location.path('routeName'); //similarily include $location service in your controller
не делая полного обновления среды маршрутизации по умолчанию (#/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 и должен был использовать метод для навигации...это сработало.
Спасибо за предыдущие посты!
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');
надеюсь, что это поможет вам
эта маленькая функция сослужила мне хорошую службу:
//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; } };
вам не нужен полный путь, просто вид, который вы переключаетесь на