如何根据上传的文件更新AngularJS服务?

时间:2014-05-11 00:23:07

标签: javascript angularjs angularjs-directive angularjs-service

当浏览器加载我的webapp时,还会加载以下常量。

var v1_module = angular.module('v1_module', []);

v1_module.constant('v1_data', {
   params: [
      {
         name: "foo",
         items: [
            {
               name: "item 1",
               checked: false
            },
            {
               name: "item 2",
               checked: false
            }
         ]
      },
      {
         name: "bar",
         items: [
            {
               name: "item 3",
               checked: false
            },
            {
               name: "item 4",
               checked: false
            }
         ]
      }
   ]
});

用户可以通过界面更改它的值,假设他使用复选框将第一项的选中值更改为true,然后他必须能够将v1_data的内容保存到.txt文件。稍后可以将此.txt文件导入应用程序以更新v1_data并相应地更改界面(在上面的示例中,必须选中第一项的复选框)。我意识到我不应该使用constant,因为我不能改变它的价值。我也尝试使用value,但没有成功。有可能做到这一点吗?我应该使用哪种服务?我正在获取上传的文件并尝试更新v1_data,如下所示。这是错的吗?

function getInputFile(files)
{    
   var reader = new FileReader();

   reader.readAsText(files[0]);

   reader.onload = function()
   {
      var input_file  = JSON.parse(reader.result);
      var v1_data     = input_file[0].data;

      v1_module.value('v1_data', v1_data);
   }
}

1 个答案:

答案 0 :(得分:0)

不确定你在这里发生了什么,但是你应该在通过服务启动模块后获取文件:

angular.module('myApp',[]).service('getTextFile',function($q){
   this.getInputFile = function(files){
   var defer = $q.defer();  
   var reader = new FileReader();

   reader.readAsText(files[0]);

   reader.onload = function()
   {
      var input_file  = JSON.parse(reader.result);
      var v1_data     = input_file[0].data;

      defer.resolve(v1_data);
   }
   return defer.promise;
   }
}).run(function(getTextFile,$rootScope){
    getTextFile.getInputFile().then(function(file){
       $rootScope.file = file;
    });
});