2015-03-23 3 views
0

Я создаю викторину в Angular и Im, используя заводскую функцию для загрузки базы данных вопросов.Угловое обслуживание не обновляется в контроллере

angular 
    .module('myQuiz') 
    .factory('QuestionService', ['$http', '$q', function($http, $q) { 

     var currentQuestion = 0; 

     return { 

      getQuestion: function() { 

      var def = $q.defer(); 

      $http.get("quizdb.json") 
       .success(function(data) { 
        // resolve the data by returning the question, choices and correctanswer in an object 
        def.resolve({ 
         totalQuestions: data.allQuestions.length, 
         question: data.allQuestions[currentQuestion].question, 
         choices: data.allQuestions[currentQuestion].choices, 
         correctAnswer: data.allQuestions[currentQuestion].correctAnswer 
         }); 
       }) 
       .error(function() { 
        def.reject("failed to retrieve questions"); 
       }); 
      return def.promise; 
      }, 
      getCurrentQuestion: function() { 
       return currentQuestion; 
      }, 
      nextQuestion: function() { 
       (currentQuestion >= 0) ? currentQuestion += 1 : false; 
      }, 
      prevQuestion: function() { 
       (currentQuestion < 0) ? false : currentQuestion -= 1; 
      } 
     }; 
}]); 

Когда пользователь нажимает кнопку «Далее», на следующей фабрике будет вызываться nextQuestion. Это правильно обновляется на заводе, но я не знаю, как получить актуальное значение в моем контроллере. Я не думаю, что $ watch будет работать, и функция тайм-аута кажется немного взломанной. Может быть, лучше использовать службу значений для хранения переменной currentQuestion?

Дополнительный вопрос: следует ли хранить логику вопроса на текущей фабрике или лучше создать отдельный?

ответ

0

Почему вы не можете просто позвонить getCurrentQuestion(), чтобы задать вопрос, или если вам нужно сделать все за один шаг, просто верните текущий вопрос с nextQuestion.

 getCurrentQuestion: function() { 
      return currentQuestion; 
     }, 
     nextQuestion: function() { 
      (currentQuestion >= 0) ? currentQuestion += 1 : false; 
      return curretQuestion; 
     }, 
+0

Это может показаться глупым, но как я могу получить возвращаемое значение? \t \t функция addQuestion() { \t \t \t vm.selected = ложь; \t \t \t QuestionService.nextQuestion(); \t \t \t getTheCurrentQuestion(); \t \t} – idontknow

+0

$ scope.variable_name = QuestionService.nextQuestion(); – Yeager

+0

Но это был мой первоначальный вопрос, он будет отражать его только один раз в контроллере, потому что он вызван только один раз. Он будет возвращать 1 каждый раз. Я вообще не понимаю этого поведения. Сервис value мог бы работать, но он не позволяет увеличивать число. – idontknow

Смежные вопросы