【问题标题】:Updating JSON data with AngularJS使用 AngularJS 更新 JSON 数据
【发布时间】:2015-08-12 04:46:19
【问题描述】:

我对 Web 开发比较陌生,我正在努力更好地了解服务器和数据库以及客户端开发的局限性。

现在,我正在学习 AngularJS,并且已经能够创建简单的 CRUD 应用程序,例如待办事项列表或在线商店。目前,我一直在通过常规的 JavaScript 数组/对象为我的 Web 应用程序创建数据。但现在我希望能够通过我自己的 CMS 用户界面永久编辑/更改这些数据。

一些研究使我使用JSON 和角度$http 服务从服务器请求JSON 数据。

现在,我正在尝试使用 angularJS 异步更新此 JSON 数据,但我不确定如何执行此操作(请参阅下面的尝试)。

简单的待办事项列表应用程序

<body ng-controller="ToDoCtrl">

  <div class="container">
    <div class="page-header">
      <h1>
        {{todo.user}}'s To Do List &nbsp;
        <span class="label label-default" ng-hide="incompleteCount() == 0"
              ng-class="warningLevel()">
          {{ incompleteCount() }}
        </span>
      </h1>
    </div>

    <div class="panel">

      <div class="input-group">
        <input class="form-control" ng-model="actionText">
        <span class="input-group-btn">
          <button class="btn btn-success" ng-click="addItem(actionText, todo.items)">Add</button>
        </span>
      </div><!-- end input-group -->

      <table class="table table-striped">
        <thead>
          <tr>
            <th>Descriptions</th>
            <th>Done</th>
            <th>Remove</th>
          </tr>
        </thead>
        <tbody>
          <tr ng-repeat="item in todo.items | checkedItems: showComplete | orderBy: 'action'">
            <td>{{item.action}}</td>
            <td><input type="checkbox" ng-model="item.done"></td>
            <td><button ng-click="deleteItem(item, todo.items)" class="btn btn-danger">Delete</button></td>
          </tr>
        </tbody>
      </table>

      <div class="checkbox-inline">
        <label><input type="checkbox" ng-model="showComplete">Show Complete</label>
      </div>

      <div class="input-group">
        <button ng-click="save()" class="btn btn-primary">Save Changes</button>
        <p>{{msg}}</p>
      </div>

    </div><!-- end panel -->
  </div>

  <!-- Vendor JS -->
  <!-- Angular -->
  <script src="vendors/angular.min.js"></script>

  <!-- Modules -->
  <script src="app.js"></script>

</body>

app.js

var model = {
  user: "Alex"
};

angular.module('todoApp', [])

.run(function($http) {

  $http.get("todo.json").success(function(data) {
    model.items = data;
  });

})

.controller('ToDoCtrl', ['$scope', '$http', function($scope, $http) {

  $scope.todo = model;

  $scope.incompleteCount = function() {
    var count = 0;
    angular.forEach($scope.todo.items, function(item) {

      if (!item.done) { 
        count++ 
      }

    });
    return count;
  };

  $scope.warningLevel = function() {
    return $scope.incompleteCount() < 3 ? "label-success" : "label-warning";
  };

  $scope.addItem = function(actionText, sourceArray) {
    sourceArray.push(
      {
        action: actionText,
        done: false,
      }
    );

    $scope.actionText = '';
  };

  $scope.deleteItem = function(item, sourceArray) {
    for(var i = 0, j = sourceArray.length; i < j; i++) {
      if(item.action == sourceArray[i].action) {
        sourceArray.splice(i, 1);
        return;
      }
    }
  };

  $scope.save = function() {
    $http.post('C:\Users\Alex\Desktop\Development\"Web Design"\2015\todoApp\public\src\todo.json', $scope.todo.items).then(function(data) {
      $scope.msg = 'Data saved '+ JSON.stringify($scope.todo.items);
    });
  };

}])

.filter("checkedItems", function() {
  return function(items, showComplete) {
    var resultArr = [];
    angular.forEach(items, function(item) {

      if(item.done == false || showComplete == true) {
        resultArr.push(item);
      }

    });
    return resultArr;
  }
});

我将这个Post 用于$scope.save 函数,但我收到一个错误:“XMLHttpRequest 无法加载。跨源请求仅支持协议方案:http、data、chrome...”

  $scope.save = function() {
    $http.post('C:\Users\Alex\Desktop\Development\"Web Design"\2015\todoApp\public\src\todo.json', $scope.todo.items).then(function(data) {
      $scope.msg = 'Data saved '+ JSON.stringify($scope.todo.items);
    });
  };

基本上,我只想用我的$scope.todo.items 数组的当前内容更新我的todo.json 文件。我认为最简单的方法是删除JSON数据的当前内容并替换为$scope.todo.items的当前内容,但我对这些东西了解不多。

感谢您的帮助。

【问题讨论】:

  • 您不能只发布到您的文件系统。您需要一个 http 服务器和服务器端应用程序。试试node.js
  • 嗯,好的。我也在玩 Node.js,我能够启动我自己的本地服务器,但每次我对我的应用程序进行更改时,我都必须刷新服务器。我可以只用 Node.js 更新todo.json 吗?
  • 是的,但是您需要发布到 http://localhost:3000/ 之类的内容,或者您​​有节点设置来处理您的请求的任何内容。你不能像你的例子那样只发帖到c:\some\path
  • 我会试试这个。谢谢!

标签: javascript json angularjs


【解决方案1】:

让我们先从一些概念开始:

1.- JSON 文件只是一个文本文件,它可以是数据库查询的产物,也可以由服务器动态生成,但归根结底只是一个文本文件。

2.- $http 服务处理对 HTTP 服务器的请求,如 Apache Web 服务器或 NodeJS Http 服务器,使用后端技术运行您的软件,有大量服务器,有些可以在您的机器上运行远程。

3.- GET 和 POST 是 HTTP 方法,必须对运行后端的服务器进行。最常见的一种,GET 方法通常用于从服务器获取数据,如文本文件或 JSON 文件。

4.- 在像 Windows 为您提供本地开发的文件服务器中,GET 方法可以从您的文件系统中调出文件(如“todo.json”)。这个文件服务器真的很基础,它只接受 GET 请求,这就是它应该接受的全部。

5.- 在您的后端软件中,您定义一个 Endpoint,它应该是您的后端准备好接收 POST 请求的地址,您还需要定义该 POST 请求的作用。

从您的 Angular 文件到在服务器中定义端点之间有很长的一步,您将遇到不同的技术,Angular 框架不是后端技术,它是一个前端库。

如果您想深入了解这些概念,TODO 列表项目是一个很好的第一个项目,http://www.todobackend.com/ 等网站可以向您展示各种不同后端和前端的各种 TODO 项目。

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多