如何将 json 加载到我的 angular.js ng-model 中?

IT技术 javascript ajax angularjs model
2021-01-26 14:09:13

我有一个我认为可能是一个非常明显的问题,但我在任何地方都找不到答案。

我只是想将一些 JSON 数据从我的服务器加载到客户端。现在,我正在使用 JQuery 通过 AJAX 调用(下面的代码)加载它。

<script type="text/javascript">
var global = new Array();
$.ajax({
    url: "/json",
    success: function(reports){
        global = reports;
        return global;
        }
    });
</script>

它位于 html 文件中。到目前为止它有效,但问题是我想使用 AngularJS。现在,虽然 Angular CAN 使用变量,但我无法将整个内容加载到变量中,因此我可以为每个循环使用 a。这似乎与“$Scope”有关,它通常位于 .js 文件中。

问题是我无法将其他页面的代码加载到 .js 文件中。Angular 的每个示例都只显示如下内容:

function TodoCtrl($scope) {
  $scope.todos = [
    {text:'learn angular', done:true},
    {text:'build an angular app', done:false}];

所以,这很有用,如果 IA)想要手动输入所有这些,并且 B)如果我事先知道我的所有数据是什么......

我事先不知道(数据是动态的),我不想输入它。

因此,当我尝试使用 $Resource 将 AJAX 调用更改为 Angular 时,它似乎不起作用。可能我想不通,但它是一个相对简单的 JSON 数据的 GET 请求。

tl:dr 我无法通过 AJAX 调用将外部数据加载到角度模型中。

3个回答

正如 Kris 提到的,您可以使用该$resource服务与服务器进行交互,但我的印象是您正在开始使用 Angular 的旅程——我上周去过那里——所以我建议直接开始试验该$http服务。在这种情况下,您可以调用它的get方法。

如果您有以下 JSON

[{ "text":"learn angular", "done":true },
 { "text":"build an angular app", "done":false},
 { "text":"something", "done":false },
 { "text":"another todo", "done":true }]

你可以像这样加载它

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

App.controller('TodoCtrl', function($scope, $http) {
  $http.get('todos.json')
       .then(function(res){
          $scope.todos = res.data;                
        });
});

get方法返回一个promise对象,其中第一个参数是成功回调,第二个参数是错误 回调。

当您$http作为函数的参数添加Angular 时,它会变魔术并将$http资源注入您的控制器。

我在这里放了一些例子

响应对象具有四个属性:configdataheadersstatusdata属性中的值就是您想要的。
2021-03-22 14:09:13
非常感谢,我最终还是使用了 $http 服务......尽管方式略有不同...... code$http.get('/json').success( function(response){ $scope.reports = response; getData();code 对我来说有趣的是 promise 对象......我真的很想了解更多关于它的信息。我喜欢它的想法。我遇到的另一个问题基本上是在 ajax 请求上运行一个循环,所以我可以不断地“自动”刷新页面。$timeout 对我不起作用。
2021-03-24 14:09:13
re:$scope.todos = res;或者$scope.todos = res.data;——区别在于你是在 a 中.then(response)还是在 a .success(result) The .successis givenresponse.data而 the .thenis given the entire response.
2021-03-24 14:09:13
值得拥有一个 $scope.todos = []; 在 http 请求之前,因此您至少有一个默认的空结构,以免在模板中引发错误。
2021-04-05 14:09:13
我相信它应该是 $scope.todos = res; 而不是 res.data。
2021-04-11 14:09:13

这是一个如何将 JSON 数据加载到 Angular 模型的简单示例。

我有一个 JSON 'GET' Web 服务,它从 Microsoft 的 Northwind SQL Server数据库的在线副本返回客户详细信息列表

http://www.iNorthwind.com/Service1.svc/getAllCustomers

它返回一些 JSON 数据,如下所示:

{ 
    "GetAllCustomersResult" : 
        [
            {
              "CompanyName": "Alfreds Futterkiste",
              "CustomerID": "ALFKI"
            },
            {
              "CompanyName": "Ana Trujillo Emparedados y helados",
              "CustomerID": "ANATR"
            },
            {
              "CompanyName": "Antonio Moreno Taquería",
              "CustomerID": "ANTON"
            }
        ]
    }

..我想用这些数据填充下拉列表,看起来像这样......

角度截图

我希望每个项目的文本都来自“CompanyName”字段,而 ID 来自“CustomerID”字段。

我该怎么做?

我的 Angular 控制器看起来像这样:

function MikesAngularController($scope, $http) {

    $scope.listOfCustomers = null;

    $http.get('http://www.iNorthwind.com/Service1.svc/getAllCustomers')
         .success(function (data) {
             $scope.listOfCustomers = data.GetAllCustomersResult;
         })
         .error(function (data, status, headers, config) {
             //  Do some error handling here
         });
}

...用这组 JSON 数据填充“listOfCustomers”变量。

然后,在我的 HTML 页面中,我会使用这个:

<div ng-controller='MikesAngularController'>
    <span>Please select a customer:</span>
    <select ng-model="selectedCustomer" ng-options="customer.CustomerID as customer.CompanyName for customer in listOfCustomers" style="width:350px;"></select>
</div>

就是这样。我们现在可以在网页上看到我们的 JSON 数据列表,可以使用了。

关键在于“ng-options”标签:

customer.CustomerID as customer.CompanyName for customer in listOfCustomers

这是一种奇怪的语法,让您大开眼界!

当用户选择此列表中的项目时,“$scope.selectedCustomer”变量将设置为该客户记录的 ID(CustomerID 字段)。

可以在此处找到此示例的完整脚本:

带有 Angular 的 JSON 数据

麦克风

对不起,你说得对。我从 Google Chrome 中截取了上面的屏幕截图,并安装了出色的 JSONView 插件(这样您就可以以格式良好的方式查看 JSON)。但是是的,来自我的 Web 服务的 JSON 是有效的。如果您单击我文章中的链接,您可以查看此代码的实时版本。
2021-03-22 14:09:13
这真的有效吗?您的 JSON 无效(键不在引号中)。你不会出错吗?
2021-04-03 14:09:13
它有效吗?我认为它应该是 data.GetAllCustomersResult
2021-04-10 14:09:13
oop,你说得对。我已经更改了 Web 服务,将 JSON 结果包含在“GetAllCustomersResult”中,所以是的,这是必需的。我已经更新了代码示例。谢谢你的提醒。
2021-04-13 14:09:13

我使用以下代码,在互联网上的某个地方找到了但不记得来源。

    var allText;
    var rawFile = new XMLHttpRequest();
    rawFile.open("GET", file, false);
    rawFile.onreadystatechange = function () {
        if (rawFile.readyState === 4) {
            if (rawFile.status === 200 || rawFile.status == 0) {
                allText = rawFile.responseText;
            }
        }
    }
    rawFile.send(null);
    return JSON.parse(allText);