sử dụng Restangular trong AngularJs

Giới thiệu

Xu hướng phát triển web hiện tại đang ủng hộ AngularJS.Đây là 1 framework khá phổ biến cho client side.Cá nhân tôi thì rất thích AngularJs vì đấy là công cụ phát triển web khá là nhanh và nó cũng khá là hữu ích cho các ứng dụng mobile .
Restangular là 1 services của AngularJS giúp thực hiện các request GET/POST/PUT/DELETE trở nên đơn giản và dễ dàng hơn.Các bước config để sử dụng Restangular:

Configuration

Sử dụng npm để cài đặt Restangular vào hệ thống:

$ npm install restangular

Ta có thể khai báo Restangular service vào Angular objects:

angular.module('your-app', ['restangular']);

hoặc

angular.module('myApp')
.controller('MainController', ['$scope', 'Restangular',
  function($scope, Restangular) {
  }]);

Note: nếu thêm Rastangular trực tiếp vào trong module app thì sẽ là 'restangular' còn nếu thêm vào controller thì là Restangular.

Khai báo BaseUrl

Thực hiện khai báo baseUrl sử dụng trong Restangular:

angular.module('myApp')
  .config(function(RestangularProvider) {
    RestangularProvider.setBaseUrl('https://api.mongolab.com/api/1/databases/ngnewsletter/collections');
  });

Get method trong Restangular

để sử dụng Restangular, có các cách để khởi tạo các object ban đầu :

//get all message
var messageService = Restangular.all('message'),

Ta cũng có thể truyền ID để lấy thông tin 1 user bằng cách:

//get all users
var oneMessage = Restangular.one('message', 'abc123');

Post method trong Restangular
Dưới đây là ví dụ thực hiện việc thêm mới message vào trong list

// POST to /messages
var newMessage = {
  body: "Hello world"
};
messageService.post(newMessage);

Put method trong Restangular
Dưới đây là ví dụ thực hiện việc edit message:

// PUT to /messages/Id
var newMessage = {
  body: "Hello world"
};
oneMessage.put(newMessage);

Delete method trong Restangular
Dưới đây là ví dụ thực hiện việc xóa message:

// DELETE to /messages/Id
oneMessage.remove();

Demo cấu trúc 1 file js khi sử dụng restangular

<script type="text/javascript">
  (function() {
    angular.module('restangularDemoApp', [
      'restangular',
      'ngCookies'
    ])
    .constant('apiKey', 'sKoiVlWRICg3e3QUtHQGUGL7ZtabgKUP')
    .config(function(RestangularProvider, apiKey) {
      RestangularProvider.setBaseUrl('https://api.mongolab.com/api/1/databases/ngnewsletter/collections');
        RestangularProvider.setDefaultRequestParams({
          apiKey: apiKey
        })
        RestangularProvider.setRestangularFields({
          id: '_id.$oid'
        });

        RestangularProvider.setRequestInterceptor(
          function(elem, operation, what) {

            if (operation === 'put') {
              elem._id = undefined;
              return elem;
            }
            return elem;
      })
    })
    .factory('Messages', [
      '$rootScope', '$cookieStore', 'Restangular',
      function($rootScope, $cookieStore, Restangular) {
        var messageService = Restangular.all('message'),
            authorService =  Restangular.all('authors');

        var service = {
          thisAuthor: function() {
            var author;
            if (!$cookieStore.get('thisAuthor')) {
              author = {
                id: guid()
              };
              $cookieStore.put('thisAuthor', author);
              authorService.post(author);
            } else {
              author = $cookieStore.get('thisAuthor');
            }
            return author;
          },
          addMessage: function(msg) {
            var newMsg = msg;
            newMsg.author = service.thisAuthor().id;
            newMsg.createdAt = new Date();
            $rootScope.$broadcast('messages:added');
            return messageService.post(newMsg);
          },
          getMessages: function() {
            return messageService.getList();
          },
          removeMessage: function(msg) {
            $rootScope.$broadcast('messages:removed');
            return msg.remove();
          },
          updateMessage: function(msg) {
            $rootScope.$broadcast('messages:updated');
            return msg.put();
          },
          getAuthorMessages: function() {
            var params = {
              author: service.thisAuthor().id
            };
            return messageService.getList({q: params});
          }
        };
        return service;
      }
      ])
    .controller('MessageController', [
      '$scope', '$timeout', 'Messages', 'Restangular',
      function($scope, $timeout,
          Messages, Restangular) {
        var thisAuthor = Messages.thisAuthor(),
            updateMessageTimeout = undefined;

        $scope.showEdit = false;
        $scope.editMessage = undefined;
        Messages.getMessages().then(function(data) {
          $scope.messages = data;
        })

        var updateMessages = function() {
          if (updateMessageTimeout) $timeout.cancel(updateMessageTimeout);

          updateMessageTimeout = $timeout(function() {

            $scope.$apply(function() {
              Messages.getMessages().then(function(d) {
                $scope.messages = d;
              });
            });
          }, 500);
        }

        $scope.$on('messages:added', updateMessages);
        $scope.$on('messages:removed', updateMessages);
        $scope.$on('messages:updated', updateMessages);

        $scope.showEditMessage = function(msg) {
          $scope.editMessage = Restangular.copy(msg);
          $scope.showEdit = true;
        }

        $scope.saveEdit = function() {
          Messages.updateMessage($scope.editMessage)
            .then(function(data) {
            $scope.editMessage = undefined;
            $scope.showEdit = false;
          });
        }

        $scope.addMessage = function() {
          Messages.addMessage($scope.newMessage);
          $scope.authorMessagesEmpty = false;
          $scope.newMessage = {};
        };

        $scope.removeMessage = function(msg) {
          Messages.removeMessage(msg);
        }

        $scope.authorMessagesEmpty = false;
        $scope.getAuthorMessages = function() {
          Messages.getAuthorMessages().then(function(d) {
            if (d.length === 0) {
              $scope.authorMessagesEmpty = true;
            } else {
              $scope.authorMessages = d;
            }
          });
        }
      }]);
  })();
</script>

Tài liệu tham khảo : http://www.ng-newsletter.com/posts/restangular.html https://github.com/mgonto/restangular