2016-05-30 1 views
0

Use Case:данных объект переменных в угловой службе обновления через AJAX вызов

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

Впервые, если данные не получены через ajax, он вернет {}. После получения данных он всегда будет возвращать эти данные.

Выпуск

Данные принимаются надлежащим образом в Ajax. Структура полученных данных - это объект. Я проверил его, войдя в консоль. Но в следующий раз, когда эта служба называется, она снова вызывает ajax, поскольку переменная внутри службы не обновляется.

Может ли кто-нибудь предложить, почему это происходит, и какой бы простой способ достичь выше?

Код:

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS) { 
    this.tagsData = {}; 

    this.getTagsData = function (cacheMode) { 
     if (JSON.stringify(this.tagsData) != "{}") { 
      console.log("returning from cache"); 
      return this.tagsData; 
     } 

     $http({ 
      method: 'GET', 
      url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
      params: {'params': JSON.stringify({})} 
     }).success(
      function (data, status, headers, config) { 
       if (data && data["success"] && data["success"] == true) { 
        this.tagsData = data["data"]; 
       } 
       return this.tagsData; 

      }).error(
      function (data, status, headers, config) { 
       return {}; 
      }); 

    }; 
}); 

ответ

2

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

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS) { 
var tagsData = {}; 

this.getTagsData = function (cacheMode) { 
    if (JSON.stringify(tagsData) != "{}") { 
     console.log("returning from cache"); 
     return tagsData; 
    } 

    $http({ 
     method: 'GET', 
     url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
     params: {'params': JSON.stringify({})} 
    }).success(
     function (data, status, headers, config) { 
      if (data && data["success"] && data["success"] == true) { 
       tagsData = data["data"]; 
      } 
      return tagsData; 

     }).error(
     function (data, status, headers, config) { 
      return {}; 
     }); 

}; 
}); 

Еще одна вещь, вы должны использовать обещание, а не возвращать свои данные. Check the documentation about $q here.

Правильный путь должен быть:

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS, $q) { 
var tagsData = {}; 

this.getTagsData = function (cacheMode) { 
    var defer = $q.defer(); 
    if (JSON.stringify(tagsData) != "{}") { 
     console.log("returning from cache"); 
     defer.resolve(tagsData); 
    }else{ 

    $http({ 
     method: 'GET', 
     url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
     params: {'params': JSON.stringify({})} 
    }).success(
     function (data, status, headers, config) { 
      if (data && data["success"] && data["success"] == true) { 
       tagsData = data["data"]; 
      } 
      return defer.resolve(tagsData); 

     }).error(
     function (data, status, headers, config) { 
      return defer.reject({}); 
     }); 

    }; 
    } 
    return defer.promise; 
}); 

И тогда вы должны назвать:

TagService.getTagsData().then(function(yourTags){ 
    // yourTags contains your data 
}); 
+0

Спасибо за такой большой response..really оценить его !! – abhinsit

+0

Ваше решение отлично работает, но для случая if (JSON.stringify (this.tagsData)! = "{}") { console.log ("возврат из кеша"); return defer.resolve (tagsData); } он не работает .... это говорит о неопределенной функции TagService.getTagsData – abhinsit

+0

Впервые до данных {} он вызывает ajax возвращает обещание, которое хорошо работает, но после этого, когда оно вызывается снова и должно возвращать данные непосредственно он выдает ошибку: TagService.getTagsData (...) не определено – abhinsit

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