使用 Spark REST API 和 AngularJS
Consuming Spark REST API with AngularJS
我已经看到了一些关于这个主题的东西,但要么它们没有真正回答我的问题,要么我太笨以至于无法将它们应用到我的情况中。我有一个我一直在玩的 Spark Core,它目前连接到一个光传感器并将该数据发布到具有 RESTful API 的 Spark 云。我正在尝试使用 AngularJS 使用该数据,但我有两个无法解决的问题。首先是我希望数据不断更新。第二个是提取我想要的精确信息。 API 调用 returns:
{
"cmd": "VarReturn",
"name": "light",
"result": 40.29304029304029,
"coreInfo": {
"last_app": "",
"last_heard": "2015-02-15T02:07:58.631Z",
"connected": true,
"deviceID": "51ff70065082554913470887"
}
}
我想要来自 "result" 的数据。到目前为止,我正在尝试:
var app = angular.module('spark', ['ngResource'])
app.factory("light", function($resource) {
return $resource("https://api.spark.io/v1/devices/51ff70065082554913470887/light?access_token=[redacted]");
})
app.controller('MainCtrl', function($scope, light) {
$scope.conditions = light.get();
});
我将其加入:
<body ng-app="spark" ng-controller="MainCtrl">
The light level is {{conditions}}
</body>
我得到:
The light level is {"cmd":"VarReturn","name":"light","result":39.8095238095238,"coreInfo":{"last_app":"","last_heard":"2015-02-15T02:09:34.483Z","connected":true,"deviceID":"51ff70065082554913470887"}}
我知道我需要向 light.get 添加一个回调函数,但我不知道该函数应该是什么样子或如何将其合并到我的 html 中。而且我不知道如何从调用返回的数据中提取我想要的特定数据。
编辑:
正如 mnemosyn 指出的那样,获取我需要的数据真的很容易,但我仍然不明白如何持续更新。我读过的教程让它看起来像是自动发生的。
不确定我是否找到你,但不会
<body ng-app="spark" ng-controller="MainCtrl">
The light level is {{conditions.result}}
</body>
完成你想要的?
或者,您可以在控制器中进行投影,例如
app.controller('MainCtrl', function($scope, light) {
$scope.data = light.get({}, function(){
$scope.conditions = $scope.data.result;
});
});
但后一种形式通常不必要地复杂,因为 Angular 表达式非常强大。
要定期重新加载,您可以使用 $interval
service
app.controller('MainCtrl', function($scope, $interval, light) {
$interval(function() {
$scope.data = light.get({}, function(){
$scope.conditions = $scope.data.result;
});
}, 1000);
});
重要的是要意识到常规 setInterval()
在这里不起作用,因为 angular 不知道值可能已更改 - 这可以通过使用 [=15= 来修复],但文档更好地解释了为什么使用 angular $interval
服务仍然是更好的主意。
我已经看到了一些关于这个主题的东西,但要么它们没有真正回答我的问题,要么我太笨以至于无法将它们应用到我的情况中。我有一个我一直在玩的 Spark Core,它目前连接到一个光传感器并将该数据发布到具有 RESTful API 的 Spark 云。我正在尝试使用 AngularJS 使用该数据,但我有两个无法解决的问题。首先是我希望数据不断更新。第二个是提取我想要的精确信息。 API 调用 returns:
{
"cmd": "VarReturn",
"name": "light",
"result": 40.29304029304029,
"coreInfo": {
"last_app": "",
"last_heard": "2015-02-15T02:07:58.631Z",
"connected": true,
"deviceID": "51ff70065082554913470887"
}
}
我想要来自 "result" 的数据。到目前为止,我正在尝试:
var app = angular.module('spark', ['ngResource'])
app.factory("light", function($resource) {
return $resource("https://api.spark.io/v1/devices/51ff70065082554913470887/light?access_token=[redacted]");
})
app.controller('MainCtrl', function($scope, light) {
$scope.conditions = light.get();
});
我将其加入:
<body ng-app="spark" ng-controller="MainCtrl">
The light level is {{conditions}}
</body>
我得到:
The light level is {"cmd":"VarReturn","name":"light","result":39.8095238095238,"coreInfo":{"last_app":"","last_heard":"2015-02-15T02:09:34.483Z","connected":true,"deviceID":"51ff70065082554913470887"}}
我知道我需要向 light.get 添加一个回调函数,但我不知道该函数应该是什么样子或如何将其合并到我的 html 中。而且我不知道如何从调用返回的数据中提取我想要的特定数据。
编辑:
正如 mnemosyn 指出的那样,获取我需要的数据真的很容易,但我仍然不明白如何持续更新。我读过的教程让它看起来像是自动发生的。
不确定我是否找到你,但不会
<body ng-app="spark" ng-controller="MainCtrl">
The light level is {{conditions.result}}
</body>
完成你想要的?
或者,您可以在控制器中进行投影,例如
app.controller('MainCtrl', function($scope, light) {
$scope.data = light.get({}, function(){
$scope.conditions = $scope.data.result;
});
});
但后一种形式通常不必要地复杂,因为 Angular 表达式非常强大。
要定期重新加载,您可以使用 $interval
service
app.controller('MainCtrl', function($scope, $interval, light) {
$interval(function() {
$scope.data = light.get({}, function(){
$scope.conditions = $scope.data.result;
});
}, 1000);
});
重要的是要意识到常规 setInterval()
在这里不起作用,因为 angular 不知道值可能已更改 - 这可以通过使用 [=15= 来修复],但文档更好地解释了为什么使用 angular $interval
服务仍然是更好的主意。