Задать вопрос
m0sk1t
@m0sk1t
SPA web-developer

Angular. Как связать директиву и контроллер?

Всем привет! Пишу простецкое приложение и уже за**ался разгребать ошибки, которые мне пишет энгулар... Мне они непонятны... Суть в чем - хочу связать контроллер чтобы он работал с директивой. ВСЁ! Прочитал доки, вопросы на SO, туториалов кучу... Не могу понять что от меня требуется...
Вот код
app.js
(function(){
	var app = angular.module('rooms', ['rooms.controllers']);
})();

controllers.js
(function() {
	var app = angular.module('rooms.controllers', []);

	app.factory('socket', function ($rootScope) {
		var socket = io('http://localhost:9999/');
		return {
			on: function (eventName, callback) {
				socket.on(eventName, function () {  
					var args = arguments;
					$rootScope.$apply(function () {
						callback.apply(socket, args);
					});
				});
			},
			emit: function (eventName, data, callback) {
				socket.emit(eventName, data, function () {
					var args = arguments;
					$rootScope.$apply(function () {
						if (callback) {
							callback.apply(socket, args);
						}
					});
				})
			}
		};
	});

	app.controller('UsersController', function($scope, socket) {
		$scope.leaders = [{
			leader: 'Test Leader',
		}];
		$scope.click = function() {
			alert($scope);
		}
		socket.emit('user online');
		socket.on('user online', function(leaders) {
			console.dir(leaders);
			$scope.leaders = leaders;
		});
	})
	.directive('usersList', function(){
		return {
			restrict: 'EA',
			templateUrl: 'js/templates/users-list.html'
		};
	});

	app.controller('ChatsController', function($scope, socket) {
		$scope.messages = [];
		$scope.send = function(msg){
			console.dir(msg);
			socket.emit('common chat message', msg || {});
		};
	})
	.directive('usersChats', function(){
		return {
			restrict: 'EA',
			templateUrl: 'js/templates/users-chats.html'
		};
	});
})();

users-list.html
<div id="users">
	<h3 ng-click="click()">users</h3>
	<ul id="userList" class="list-group">
		<li class="list-group-item" ng-repeat="u in leaders" ng-click="alert(u.leader)">
		{{u.leader}}
		</li>
	</ul>
</div>


Ну и вставляю в index.html
<users-list></users-list>

Но переменные и функции контроллера undefined(смотрю с помощью Batarang)...

click is undefined
send is undefined

А если пишу
<div ng-controller="UsersController" users-list></users-list>


Мне пишет
Error: [$injector:unpr] errors.angularjs.org/1.4.4/$injector/unpr?p0=eProv...


Пробовал разделять директиву и контроллер, писать массив для DI, писать this instead $scope, по всякому... Либо переменные undefined, либо вышенаписанная ошибка... ЧЯДНТ?

Angular отсюда
Socket.IO отсюда
P.S. Собираю Gulp'ом. Вот скрипт сборки:
Gulpfile.js
var gulp = require('gulp'),
    csso = require('gulp-csso'),
    concat = require('gulp-concat'),
    minify = require('gulp-minify');

gulp.task('default', function() {
    gulp.src([
        "pub/js/app.js",
        "pub/js/controllers/controllers.js"
    ])
    .pipe(concat('rooms-app.js'))
    .pipe(minify())
    .pipe(gulp.dest('pub/'));

    gulp.src([
        "pub/css/*.css"
    ])
    .pipe(concat('rooms-app.css'))
    .pipe(csso())
    .pipe(gulp.dest('pub/'));
});



P.P.S. Вот пример в JSFiddle
  • Вопрос задан
  • 590 просмотров
Подписаться 2 Оценить 4 комментария
Решения вопроса 1
@couchemar
Под jsfiddle не удалось таки запустить.
Но вот вариант делающий вид что работает: plnkr.co/edit/iNTPWJOuQhVtC84SaQ6C?p=preview
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы