Я разрабатываю в первый раз с Angular JS, и я редактирую приложение моего друга. Я бы назвал фабрику из директивы, которая находится в другом файле. Вот код задействованных файлов:
пользовательский factory.js
(function() {
'use strict';
angular.module('myApp.services').factory('currUserService', function() {
var curruser = '';
var self = this;
return {
setCurrUser: function(user) {
self.curruser = user;
},
getCurrUser: function() {
return self.curruser;
},
}
});
}());
Главные-пользователи-box.js
(function() {
'use strict';
angular.module('myApp.directives').directive('mainpageUsersBox', function() {
return {
restrict: 'E',
replace: true,
scope: {
users: '=users'
},
templateUrl: 'views/templates/mainpage-users-box.directive.html',
controller: controller,
controllerAs: 'ctrl'
};
});
function controller($scope) {
var ctrl = this;
ctrl.openProfile = function(user) {
ctrl.currUserService.setCurrUser(user);
};
}
controller.$inject = ['$scope'];
}());
mainpage.html
[...]
<mainpage-users-box users="ctrl.users"></mainpage-users-box>
[...]
Как вы можете видеть во втором файле, я хочу использовать .setCurrUser(user)
но я получаю эту ошибку: TypeError: Не удается прочитать свойство setCurrUser undefined в консоли Chrome.
Можете ли вы помочь мне разобраться, что может быть причиной?
Похоже, вы вообще не вводите эту услугу:
// Where the service?
function controller($scope) {
var ctrl = this;
ctrl.openProfile = function(user) {
ctrl.currUserService.setCurrUser(user);
};
}
// Where currUserService?
controller.$inject = ['$scope'];
Не будет ли это работать, если вместо этого вы измените свой контроллер?
function controller(currUserService) {
var ctrl = this;
ctrl.openProfile = function(user) {
ctrl.currUserService.setCurrUser(user);
};
}
controller.$inject = ['currUserService'];
Кажется, вы используете controllerAs
стиль написания контроллеров. В этом случае вам не нужно вводить $scope
, если вы не добавляете $watches
.
<script src="/scripts/services/user-factory.js"></script>
и<script src="/scripts/directives/mainpage-users-box.js"></script>