По причинам, по которым я бы не стал здесь заниматься, я добавляю список событий в заводском методе (serviceAFunction) против контроллера. Когда я нажимаю цепочку вызовов, она не работает. Я получаю сообщение "Uncaught TypeError: this.serviceC is not a function"
в консоли браузера. Что я делаю не так?
Я пробовал подход Prototype, а также показан в следующем фрагменте, но больше не повезло.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My Angular App</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script type="text/javascript">
(function () {
'use strict';
function myFactory($http) {
var service = {
serviceA: serviceAFunction,
serviceB: serviceBFunction,
serviceC: serviceCFunction,
serviceD: serviceDFunction,
callParams: {}
};
return service;
function serviceAFunction() {
alert("From A service");
document.getElementById("myBtn").addEventListener("click", this.serviceB);
//document.getElementById("myBtn").addEventListener("click", function () { alert(1);});
//document.getElementById("myBtn").addEventListener("click", $scope.doSomeThing);
this.serviceB();
}
function serviceBFunction() {
alert("From B service");
// During click event the following call fails.
this.serviceC();
}
function serviceCFunction() {
alert("From C service");
this.serviceD();
}
function serviceDFunction() {
alert("From D service");
}
}
function myController($scope, $controller, myFactory) {
$scope.doSomeThing = function () {
myFactory.serviceA();
};
myFactory.serviceA();
}
angular.module('myApp', []);
angular.module('myApp').factory('myFactory', myFactory);
myFactory.$inject = ['$http'];
angular.module('myApp').controller('myController', myController);
myController.$inject = ['$scope', '$controller', 'myFactory'];
}())
</script>
</head>
<body>
<div data-ng-app="myApp">
<div data-ng-controller="myController">
<h1>Here we go...</h1>
<div id='MyTrial'>
<input id="myBtn" type="button" value="Click Me" />
</div>
</div>
</div>
</body>
</html>
Прототипный подход. Здесь нет успеха.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My Angular App</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script type="text/javascript">
(function () {
'use strict';
function myFactory() {
function Factory($scope) {
this.$scope = $scope;
}
Factory.prototype.serviceA = serviceAFunction;
Factory.prototype.serviceB = serviceBFunction;
Factory.prototype.serviceC = serviceCFunction;
Factory.prototype.serviceD = serviceDFunction;
return Factory;
function serviceAFunction() {
alert("From A service");
document.getElementById("myBtn").addEventListener("click", this.$scope.newFactory.serviceB);
//document.getElementById("myBtn").addEventListener("click", function () { alert(1);});
//document.getElementById("myBtn").addEventListener("click", $scope.doSomeThing);
this.serviceB();
}
function serviceBFunction() {
alert("From B service");
// What ever I do here, during click event the following call fails.
this.$scope.newFactory.serviceC();
}
function serviceCFunction() {
alert("From C service");
this.$scope.newFactory.serviceD();
}
function serviceDFunction() {
alert("From D service");
}
}
function myController($scope, $controller, myFactory) {
$scope.doSomeThing = function () {
//myFactory.serviceA();
};
$scope.newFactory = new myFactory($scope);
$scope.newFactory.serviceA();
}
angular.module('myApp', []);
angular.module('myApp').factory('myFactory', myFactory);
//myFactory.$inject = ['$scope'];
angular.module('myApp').controller('myController', myController);
myController.$inject = ['$scope', '$controller', 'myFactory'];
}())
</script>
</head>
<body>
<div data-ng-app="myApp">
<div data-ng-controller="myController">
<h1>Here we go...</h1>
<div id='MyTrial'>
<input id="myBtn" type="button" value="Click Me" />
</div>
</div>
</div>
</body>
</html>
Кажется, это проблема с javascript.
Вы должны кэшировать родительскую область следующим образом:
var self = this;
function serviceBFunction() {
alert("From B service");
// During click event the following call fails.
self.serviceC();
}
Почему вы выполняете функцию jquery onclick в Factory? Есть ли необходимость.
Если вы хотите, чтобы служба вызова B нажала кнопку, вызовите этот метод через контроллер.
Когда вы используете jquery onclick, то здесь это будет действовать как элемент, который вы на самом деле пытаетесь сделать $ (element). Таким образом, у этого не будет набора методов/переменных, где будут удерживаться угловые фабрики.
Но в Угловом сценарии это другое. Поскольку вам нужно отлаживать объемные или заводские функции, тогда сделайте свою логику кода на фабрике вместо функций jquery onclick.
<head>
<title>My Angular App</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script type="text/javascript">
(function () {
'use strict';
function myFactory($http) {
var service = {
serviceA: serviceAFunction,
serviceB: serviceBFunction,
serviceC: serviceCFunction,
serviceD: serviceDFunction,
callParams: {}
};
return service;
function serviceAFunction() {
alert("From A service");
// document.getElementById("myBtn").addEventListener("click", this.serviceB);
//document.getElementById("myBtn").addEventListener("click", function () { alert(1);});
//document.getElementById("myBtn").addEventListener("click", $scope.doSomeThing);
this.serviceB();
}
function serviceBFunction() {
alert("From B service");
// During click event the following call fails.
this.serviceC();
}
function serviceCFunction() {
alert("From C service");
this.serviceD();
}
function serviceDFunction() {
alert("From D service");
}
}
function myController($scope, $controller, myFactory) {
$scope.doSomeThing = function () {
myFactory.serviceB();
};
myFactory.serviceA();
}
angular.module('myApp', []);
angular.module('myApp').factory('myFactory', myFactory);
myFactory.$inject = ['$http'];
angular.module('myApp').controller('myController', myController);
myController.$inject = ['$scope', '$controller', 'myFactory'];
}())
</script>
</head>
<body>
<div data-ng-app="myApp">
<div data-ng-controller="myController">
<h1>Here we go...</h1>
<div id='MyTrial'>
<input id="myBtn" type="button" ng-click="doSomeThing()" value="Click Me" />
</div>
</div>
</div>
</body>
this
service
переменная