2015-07-09 2 views
0

У меня есть служба, и я пытаюсь создать рекурсивную функцию:AngularJS внутри сервисной функции это возвращает нуль

function(angular){ 
    'use strict'; 

    angular.module('main') 
     .service('testRecursionService', function() {return { 
       'factorial': function(data){ 
        if(data = 1){ 
         return data 
        } 
        else{ 
         return data * this.factorial(data - 1); 
        } 

       }}})}(angular.window) 

Когда я вызываю функцию факториала внутри контроллера, он говорит, что это не определено. Я из фона Java/C#, поэтому мое понимание - это объект службы, созданный инжектором, и с этого момента я должен иметь возможность вызвать факториальную функцию.

Но как это не определено? Я что-то упускаю?

+0

@skubski Вы можете использовать это в службе, хотя. Я делаю это все время. – Chrillewoodz

+0

@Chrillewoodz Вы были правы: контекст выполнения остается неизменным в объявлении объекта. Я забыл об этом исключении. Получил любовь JS. ;) – skubski

+0

@skubski Да, это замечательный язык: p – Chrillewoodz

ответ

0

Попробуйте это:

'use strict'; 

function(angular) { 

angular.module('main') 
    .service('testRecursionService', function() { 
    return { 
     factorial: function(data){ 
     if(data === 1){ 
      return data; 
     } 
     else { 
      return data * this.factorial(data - 1); 
     } 
     } 
    }; 
    }); 
}(angular.window); 

Этот вопрос должен быть, что у вас ваше имя функции (factorial) в кавычки, говоря, что это не определено.

Также вам необходимо изменить = на === в вашем заявлении if. Или вы назначаете data как 1 вместо того, чтобы проверить, что это 1.

0

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

Demo

script.js

var app = angular.module('main', []); 

app.service('RecursionService', function(){ 

    var service = { 
     'factorial': factorial 
    }; 


    return service; 
    //////////////////// 

    function factorial(data){ 

     // not '=' as this always be true 
     if(data === 1){ 
      return data; 
     } 

     return data * this.factorial(data - 1); 

    } 

}); 

app.controller('foo', foo); 

foo.$inject = ['$scope', 'RecursionService']; 

function foo($scope, RecursionService){ 

    $scope.number = { 
    value: 1 

    }; 

    $scope.getResult = function(num){ 
    $scope.result = RecursionService.factorial(num); 
    } 

    $scope.getResult($scope.number.value); 

} 

index.html

<!DOCTYPE html> 
<html > 

    <head> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> 
    </head> 

    <body ng-app="main" > 
    <div ng-controller="foo"> 
     <input type="text" ng-model="number.value" ng-change="getResult(number.value)"> 
     {{result}} 
     </div> 

    <script src="script.js"></script> 
    </body> 

</html> 
+0

Не нужно усложнять объявление сервиса tbh, это делает его более нечитаемым. – Chrillewoodz