Search code examples
javascriptjsonangularjssingle-page-applicationdata-export

Save object to JSON file in angularjs?


I am new to angularjs and trying create an single page application. I have a home controller with very simple code. Something along the lines of this tutorial

Angular JS controller is initialized with code like:

var phonecatApp = angular.module('phonecatApp', []);
phonecatApp.controller('PhoneListCtrl', function ($scope) {
  $scope.phones = [
    {'name': 'Nexus S',
     '_id': 1,
     'snippet': 'Fast just got faster with Nexus S.'},
    {'name': 'Motorola XOOM™ with Wi-Fi',
     '_id': 2,
     'snippet': 'The Next, Next Generation tablet.'},
    {'name': 'MOTOROLA XOOM™',
     '_id': 3,
     'snippet': 'The Next, Next Generation tablet.'}
  ];
});

but in production data might not be so neatly packed. Now my problem is:

Can I create a download link to a JSON representation of my objects?

<li ng-repeat="phone in phones">
<a 
  href="data:text/json;charset=utf-8,{{encodeURIComponent(JSON.stringify(phone))}}" 
  download="{{phone._id}}.json">
    JSON
</a>
</li>

I basically want to access the current object phone with the formatting function encodeURIComponent(JSON.stringify(phone)).

Is there a way to do this neatly?


Solution

  • Thanks to the suggestions of rnrneverdiesI added the following to the config

    phonecatApp.config(['$compileProvider', function ($compileProvider) {
      $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|file|data|blob):/);
    }]);
    

    and these functions to the $scope in the controller

    $scope.stripClone = function(obj) {
      if (null == obj || "object" != typeof obj) return obj;
      var copy = obj.constructor();
      for (var attr in obj) {
        if (obj.hasOwnProperty(attr) && attr != '$$hashKey') {
          var obj_attr = obj[attr];
          if (typeof obj_attr == "object"){
            copy[attr] = this.stripClone(obj_attr); 
          } else if (typeof obj_attr == "array"){
            copy[attr] =[];
            for(var i =0; i<obj_attr.length; i++){
              copy[attr].push(this.stripClone(obj_attr));
            }
          }else{
            copy[attr] = obj_attr;
          }
        }
      }
      return copy;
    };
    $scope.myEncodeJson = function(obj){
      return JSON.stringify(this.stripClone(obj));
    };
    

    I can now call these functions in the template to do the json magic I wanted:

    <a ng-href="data:text/json;charset=utf-8,{{myEncodeJson(phone)}}
    

    Thanks for your help