2015-05-27 3 views
0

Извинения, если это очевидно, я немного угловой \ Javascript noob. У меня есть следующие услуги:Javascript Angular function scope confusion

MyApp.service('ClientService', function ($http, $q, SharedData) { 

    this.get = function() { 
     var deferred = $q.defer(); 
     $http.get("/api/Client/") 
      .success(function(data, status) { 

       deferred.resolve(data); 
      }) 
      .error(function(data, status) { 
       deferred.reject(data); 
      }); 

     return deferred.promise; 
    }; 

    this.setCurrentClient = function (clientToSelect) { 
     var deferred = $q.defer(); 
     var getCurrentClient = this.get(); 

     $http({ method: "POST", url: "/api/Client", data: clientToSelect }) 
      .success(function (data, status) { 

       //Get the full selected client and all its properties rather than the list version 
       getCurrentClient.then(
        function (client) { 
         setCurrentClient(client); 
         setCurrentPeriod(client); 
        }, 
        function (data) { 
         //uho something broke. 
        }); 

       deferred.resolve(data); 
      }) 
      .error(function (data, status) { 
       deferred.reject(data); 
      }); 

     return deferred.promise; 
    } 

    ..... 
}); 

В функции this.setCurrentClient я сделать вызов бэкэнда через $ HTTP и его асинхронного успешного возвращения я вызываю функцию получить с помощью переменной getCurrentClient. Сначала я пытался напрямую вызвать get() или this.get() и не работал. Контекст в функции callback .success представляется глобальным контекстом окна, а не контекстом службы. Вышеприведенное решение кажется мне немного грязным. Есть ли лучший способ получить контекст службы и вызвать get(), а не устанавливать переменную с помощью метода (get getCurrentClient = this.get()), а затем вызвать его (getCurrentClient.then())? Немного потерянный с javascript \ угловой областью и контекстами ...

+0

Вы смотрели на службу $ ресурсов? Похоже, это то, что вы действительно после? – Patrick

+0

Это чистый обзор JavaScript. Ничего не связано с углом зрения. Вам необходимо сохранить ссылку на область видимости и получить доступ к методам из сохраненной ссылки. 'var self = this; self.setCurrentClient(); 'Else вы должны использовать https://docs.angularjs.org/api/ng/function/angular.bind –

+0

У меня нет проблемы с вызовом бэкэнд-сервиса через $ http. Я полагаю, что использование ресурса $ resource примерно одинаково, но для служб RestFul, которые мы действительно не используем. Обратные вызовы Async одинаковы. @VigneswaranMarimuthu Я думаю, что это было в основном тем, что я закончил тем, что сохранил метод get() внешних областей в переменной для вызова во внутренней функции. Я не понимаю, почему я должен это делать? Почему я не могу получить доступ к внешней области? – sarin

ответ

0

Я считаю, что вам не нужно использовать «это» в своей службе, вы можете просто объявить свою функцию как function get() { ..., а затем в обратном вызове в setCurrentClient, звоните:

var getCurrentClient = get(); 

Однако, если вы действительно нуждаетесь в «это», общая картина с помощью var self = this; или что-то подобное - см this discussion.

(как в стороне, я также рекомендовал бы переименование функции и переменные, чтобы иметь var clientPromise = getCurrentClient(); для лучшей читаемости.)

0

Я бы сказал, использование углового factory в этом случае.

MyApp.factory('ClientService', function ClientFactory($http, $q, SharedData) { 

    function get() { 
     var deferred = $q.defer(); 
     $http.get("/api/Client/") 
      .success(function(data, status) { 

       deferred.resolve(data); 
      }) 
      .error(function(data, status) { 
       deferred.reject(data); 
      }); 

     return deferred.promise; 
    }; 

    function setCurrentClient(clientToSelect) { 
     var deferred = $q.defer(); 
     var getCurrentClient = get(); 

     $http({ method: "POST", url: "/api/Client", data: clientToSelect }) 
      .success(function (data, status) { 

       //Get the full selected client and all its properties rather than the list version 
       getCurrentClient.then(
        function (client) { 
         setCurrentClient(client); 
         setCurrentPeriod(client); 
        }, 
        function (data) { 
         //uho something broke. 
        }); 

       deferred.resolve(data); 
      }) 
      .error(function (data, status) { 
       deferred.reject(data); 
      }); 

     return deferred.promise; 
    } 

    ..... 
    // Expose the service methods 
    return { 
     get: get, 
     setCurrentClient: setCurrentClient 
     ...... (Expose what all methods you wanted to expose) 
    }; 
}); 
0

Вот как я хотел бы использовать услугу, как вы want..`When вы пытаетесь вызвать запрос this.get внутри HTTP затем этот будет искать способ попасть в рамках окна, и если вы печатаете это ключевое слово в консоли вы можете видеть, что метода get нет. Это всегда относятся к Object где вы используете это

MyApp.service('ClientService', function ($http, $q, SharedData) { 

        var get = function() { 
         var deferred = $q.defer(); 
         $http.get("/api/Client/") 
          .success(function (data, status) { 

           deferred.resolve(data); 
          }) 
          .error(function (data, status) { 
           deferred.reject(data); 
          }); 

         return deferred.promise; 
        }; 

        var setCurrentClient = function (clientToSelect) { 
         var deferred = $q.defer(); 

         $http({ 
           method: "POST", 
           url: "/api/Client", 
           data: clientToSelect 
          }) 
          .success(function (data, status) { 

           //Get the full selected client and all its properties rather than the list version 
           get().then(
            function (client) { 
             setCurrentClient(client); 
             setCurrentPeriod(client); 
            }, 
            function (data) { 
             //uho something broke. 
            }); 

           deferred.resolve(data); 
          }) 
          .error(function (data, status) { 
           deferred.reject(data); 
          }); 

         return deferred.promise; 
        } 
        this.get = get; 
        this.setCurrentClient = setCurrentClient; 
       });) 
      .error(function (data, status) { 
       deferred.reject(data); 
      }); 

     return deferred.promise; 
    } 
    this.get = get; 
    this.setCurrentClient = setCurrentClient; 
})