2014-12-05 2 views
2

После прочтения как api, так и руководства разработчика я до сих пор не понимаю функциональность, предоставляемую объявлением «контроллера» в заданном маршруте. Прямо сейчас у меня только что мои контроллеры объявлены как директивы ng-controller в моих представлениях. Является ли ngRoute просто альтернативным методом?Требуется ли объявление углового ngRoute 'Controller'?

Для того, чтобы мой вопрос явно в коде, смотрите ниже:

--Index.html 
... 
<body ng-app="MyApp"> 
    <div ng-view> 
    </div> 
</body> 

--View.html 
<div id="myView" ng-controller="MyController"> 
... 
</div> 

--Route.js 
var app = angular.module('MyApp', [ require('angular-route') ]); 

app.controller('MyController', ['$scope', function ($scope) { 
    console.log('this gets executed as I would expect'); 
}]) 
.config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/', { templateUrl: '/Index.html' }) 
    .when('/view', { templateUrl: '/View.html' }); 
    // below line makes no difference as an alternative to above 
    //.when('/view', { templateUrl: '/View.html', controller: 'MyController' }); 
}]); 
+1

Я не знаю всех деталей, но по крайней мере ng-route также обеспечивает функциональность 'resolve'. – Rasalom

+0

, когда вы укажете контроллер на маршрутах, вам не нужно указывать тег ng-controller в представлении. –

+0

@ TechMa9iac - тогда почему? – aaaaaa

ответ

3

Есть два способа определить контроллер для зрения.

  1. Либо в декларации контроллера в нг-маршрут
  2. в нг-контроллер для просмотра.

Любой из них в порядке.

2

Вы должны выбрать один из вариантов по сравнению с другим, поскольку оба они фактически дадут вам дубликаты контроллеров, то есть оба будут использоваться. Если вы используете Routes, вы можете указать несколько дополнительных свойств, таких как разрешение, упомянутое в комментариях, и это позволит вам выполнить действие или предоставить дополнительные данные и т. Д.

Взгляните на это статья, Using Resolve In Angular, для получения дополнительной информации.

Кроме того, вы должны изучить, используя Controller As, который устанавливает вас для будущей проверки. У Джона Папы есть несколько блогов и видеороликов, где он хвалит использование Controller As и используя синтаксис стиля var vm = this;, посмотрите here.

Кроме того, в качестве дополнительной заметки вы должны использовать .otherwise на своих маршрутах, так как это будет захватывать любые недопустимые запросы и, по крайней мере, обслуживать действительную страницу с вашего сайта. Вы можете увидеть это в routeProvider documentation.

+0

Я фактически протестировал, используя оба кода, и код не выполнялся дважды. Это просто неопределенное поведение? Я мог бы дважды проверить свой тестовый пример, если вы думаете, что этого не должно быть. Изменить: И спасибо за упоминание «Контроллер как». Я забыл об этом в разгар всех статей о «начале работы с угловатыми». – aaaaaa

+1

Странно, я смотрел видеоролик PluralSight прошлой ночью, где этот побочный эффект был показан в качестве примера ... Это был чистый код Джона Папы, если у вас есть подписка. – christiandev

+0

Я не ... но я определенно ценю подсказку. – aaaaaa