2016-04-27 8 views
-3

Я пытаюсь понять, почему некоторые из вложенных зависимостей (или другие объявленные переменные) в моем контроллере недоступны внутри обратного вызова успеха/ошибки функции «then» отложенного обещания.Что такое лексический охват обратного вызова успеха «тогда» функции углового обещания?

Я искал в угловой документации по $ q и в нескольких сообщениях здесь, но я не могу ответить на мой вопрос ... Возможно, я не ищу подходящие ключевые слова, я не знаю.

Вот фрагмент моего контроллера с вопросами, которые я хочу знать. Спасибо заранее!

(function() { 
'use strict'; 
angular 
    .module('app.aModule') 
    .controller('mycontroller', MyController); 

MyController.$inject = ['$controller', '$scope', 'myService']; 

function MyController($controller, $scope, myService) { 

    $scope.myProp; 
    var myVariable1 = 'hello'; 

    //.............some code................. 

    $scope.save = function(event) { 
      var myVariable2 = 'World!'; 
      myService.post($scope.myProp).then(
       function (result) { 
        // 1. can I access to myVariable1 here? 
        // 2. can I access to myVariable2 here? 
        // 3. can I access to $scope or $controller dependency here? 
        // 4. can I access to myService dependency here? 
       }, 
       function (error) { 
        // do something 
       } 
      ); 
     }; 

    //.............some code................. 
} 

})(); 

А вот пост метод моей угловой службы:

function post(data) { 
     var deferred; 
     deferred = $q.defer(); 

     $http.post(apiUrl + endpoint + 'post', data).then(function (result) { 
      deferred.resolve(result); 
     }, function (error) { 
      deferred.reject(error); 
     }); 

     return deferred.promise; 
    }; 
+0

Просто отлаживать. Это легко – Mediator

+0

@ Mediator Хе-хе, я уже это сделал, но я хотел бы понять теорию. BTW, при отладке я могу получить доступ только к зависимостям $ scope и myService (а не от $ controller и других переменных). – DiegoA29

+0

1-3 ответ да, не уверен, что вы упоминаете в 4-й точке, '$ http.post' уже возвращает обещание, прекратите обертывать его' deferred.promise' ... – mido

ответ

0

Это не зависит от обещаний. Вы не можете понять функцию закрытия.

Закрытие - это функция, имеющая доступ к родительской области (она не является угловой областью), даже после закрытия родительской функции. Если вы напишете myVariable1 или (и) myVariable2 в функцию, это позволяет видеть эти varibales, но если вы просто отлаживаете его, вы не можете его увидеть (если вы его не пишете).

Ответы: 1 и 2 - зависит от того, как вы это делаете. 3. $ scope - да. контроллер - не может понять, что значит. 4. тот же ответ, что и 1 и 2.

+0

Я знаю, что такое закрытие. Я написал код, поэтому я отлаживал его, а результат отладки - тот, на который ответил ваш предыдущий неопознанный комментарий. Можете ли вы подробнее рассказать о своих ответах относительно «зависит, как вы это делаете»? Это немного общий. $ controller отвечает за создание экземпляров контроллеров .... но вы должны больше узнать об угловых, если вы не можете понять такие вещи. – DiegoA29

+0

То, что вы объяснили о превращении переменных в функции, не имеет смысла. Если вы понимаете, что означает «родительская область», вы должны знать, что это не вопрос функций или переменных. – DiegoA29

+0

Предлагаю создать jsfiddle. Потому что вы должны видеть myVariable1 и myVariable2. Когда я рассказывал о том, «зависит, как вы это делаете», я имею в виду, что вы должны написать myVariable1 внутри обещания. Если вы не пишете, вы не увидите его в отладке. – Mediator

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

  • Нет связанных вопросов^_^