2015-02-12 5 views
0

Однако после написания нескольких примеров игры с контроллерами загрузка не будет загружена. Я получаю сообщение об ошибке:Я пытаюсь понять контроллер AngularJS. Синтаксис

firstController is not a function 

Через некоторое Googling я обнаружил, что Угловая 1.3.x больше не поддерживает глобальные контроллеры. Все примеры, которые я видел в новом способе создания контроллеров, похоже, создают их в моем файле app.js. Я смущен, теперь это означает, что я должен создать все мои контроллеры здесь, а не иметь выделенный файл для каждого контроллера. Я пробовал это, чтобы создать контроллер, и все еще не повезло:

UPDATE: Я изменил свой контроллер, чтобы ответить на ответ jedanput, но изменил для него $ scope.

app.controller('firstController', [function(){ 
this.name = "Tim"; 

}]);

Также я нахожу очень раздражающим, что все, что подавляющее большинство примеров там все еще упоминают, как это было сделано в Angular 1.2. Любая помощь будет принята с благодарностью, поскольку у меня возникли проблемы с пониманием этой проблемы.

EDIT: Вот мой файл index.html. Надеюсь, это поможет вам, ребята, понять, что происходит не так.

<!DOCTYPE html> 
<html lang="en" xmlns:ng="http://angularjs.org" id="ng-app"  ng-app="myApp"> 

<head > 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
    <title>ControllerAs</title> 
    <meta name="description" content=""> 

</head> 
<body> 



<div class="content" ng-view=""></div> 

<!-- jQuery --> 
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 

<!-- AngularJS --> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.6/angular.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.6/angular-route.js"></script> 

<script type="text/javascript" src="../js/app.js"></script> 

<!--Directives--> 
<script type="text/javascript" src="../js/directives/it-works.js"> </script> 

<!--Controllers--> 
    <script type="text/javascript" src="../js/controllers/firstController.js"></script> 
    <script type="text/javascript" src="../js/controllers/secondController.js"></script> 





</body> 
</html> 

До сих пор я избегал контроллеры, как все, что я делал можно было бы сделать с директивами и услуг, но это время я понял больше о контроллерах. Я думаю, что это может быть что-то фундаментальное, чего я не хватает. Снова любая помощь приветствуется.

UPDATE: по-прежнему возникает ошибка. Это мой файл app.js. Может быть, это может пролить свет на проблему.

var app = angular.module('myApp',[ 
'ngRoute' 


]); 

app.config(function($routeProvider) { 
    $routeProvider.when('/', { 
     templateUrl: "../partials/test-skeleton.html" 



}) 
}); 
+0

'Я пробовал это, чтобы создать контроллер, и до сих пор не повезло: что означает« не повезло »? – Blackhole

+5

Прежде всего, то, что вы описываете, не имеет ничего общего с синтаксисом controllerAs. Во-вторых, вы можете создать файл на контроллер. Пожалуйста, покажите больше своего кода, предпочтительно на plnkr. – restassured

+0

Вы не предоставили нам достаточно информации, чтобы помочь вам рассказать, почему вы получаете 'firstController, это не функция'. Кроме того, вы все еще используете '$ scope', вместо' this.name' - 'controllerAs' удаляет эту зависимость. – Tom

ответ

1

Это должно быть

app.controller('firstController', ['$scope', function($scope){ 
    $scope.name = "Tim"; 
}]); 

Кроме того, синтаксис controllerAs синтетический сахар для области просто, вы не использовать это:

<div ng-controller="oneCtrl"> 
    {{name}} 
</div> 

И вместо того, чтобы использовать это:

<div ng-controller="oneCtrl as one"> 
    {{one.name}} 
</div> 

Это очень помогает, когда у вас есть вложенные контроллеры.

1

Вы правы, Угловой допускает несколько разных обозначений, и это может быть раздражающим и запутанным. Я бы рекомендовал вам придерживаться рекомендаций от John Papas Angular Style Guide. Он использует это:

Вы хотите сохранить материал из глобального пространства. На самом деле - это так. Вот почему он обертывает все в выражении с мгновенной вызывной функцией (IIFE). Кроме того, вы хотите явно определить, что вы вводите (массив $inject). Если нет, позже вы не сможете их минимизировать.

Так что я сожалею - я просто добавил еще один способ определения ваших артефактов AngularJS. Насколько я понимаю, это один из наиболее известных руководств по стилю. Я слышал, что он тесно сотрудничает с парнями Angular, чтобы убедиться, что его руководство по стилю также облегчит переход на новую версию с угловыми углами.

И нет - вам не нужно класть все в 1 файл - просто убедитесь, что у вас есть файл с angular.module('myapp',[]), загруженный перед любым другим файлом. Это объявит модуль myapp и добавит к нему контроллер.

Как я это пишу, я понимаю, что есть и другой способ: вы создаете новый модуль в этом файле, добавляете контроллер и загружаете этот модуль в свое приложение. Но да ... это сбивает с толку.

+0

Очень сильно основанный на мнениях, этот путеводитель по стилю первым признал это. Это не обязательно лучший способ сделать что-то, и определенно не следует считать «де-факто стандартом». – ribsies

+0

Я не согласен, очевидно, что OP борется с синтаксисом AngularJS, и это справедливо, так что есть несколько способов делать вещи в Angular. Поэтому подталкивать его в направлении к структуре выгоднее, чем вредно. Возможно, он мог бы использовать другой язык, но в целом пост помогает больше, чем наносит вред. –

+0

@jedanput, это переводная вещь Голландский английский - в Enlish это звучит намного сильнее, чем на голландском. То, что у меня было в голове, было «Из того, что я понимаю, это должно быть ...». Это «zou moeten zijn» на голландском языке, и я неправильно перевел «should». Я сделал эту ошибку раньше с моей женой ... В любом случае - не беспокойтесь, я изменил ее. –