AngularJS从服务器加载数据(设置)
AngularJS load data (settings) from server
我用Laravel 5制作了一个简单的订餐应用程序。现在我正在尝试使用AngularJS来分离前端和后端。Angular从后端获取数据,这是一个基于Laravel(Lumen)的REST API。
数据库中存储了一些由键值对组成的设置。想想"最低订单金额"answers"配送成本"之类的设置。通常,我只需在我的Laravel应用程序中调用setting(key)
:
/**
* Get the value for the given setting from the database.
*
* @param mixed $key
* @return mixed
*/
function setting($key)
{
static $settings;
if(is_null($settings)) {
$settings = Cache::rememberForever('settings', function() {
return array_pluck(App'Setting::all()->toArray(), 'value', 'key');
});
}
return (is_array($key)) ? array_only($settings, $key) : $settings[$key];
}
请注意静态函数,它允许我每次请求多次调用setting()
函数,但只查询数据库一次。如何在我的Angular应用程序中实现这一点?
我可以用这样的东西来完成同样的任务:
/**
* Retrieve the value of the given setting.
*/
function setting(key) {
$.get(apiUrl('api/setting'), function(data) use (key) {
return data.key;
});
}
但这将导致来自数据库的多个请求(针对同一组数据),每页加载多次。这是相当低效的。
编辑(最终工作示例)
app.factory('Setting', ['$q', '$http', function($q, $http) {
var url = 'api/setting';
var promise = null;
function load() {
if ( ! promise) {
promise = $q.defer();
$http.get(apiUrl(url))
.success(function(data) {
promise.resolve(data);
})
.error(function(data) {
promise.reject(data);
});
}
return promise.promise;
}
return {
load: load
}
}]);
// Usage
Setting.load().then(function(result) {
console.log(result);
});
使用服务,必要时使用缓存系统。
angular.factory('SettingsService', SettingsService);
function SettingsService($q, $http) {
var userUrl = ApiConfigurationService.userUrl;
var url = 'api/setting';
var promise = null;
function loadSettings() {
if (!promise) {
promise = $q.defer();
$http.get('url', function(res) {
settings = res.data;
promise.resolve(res.data);
}, function(res) {promise.reject(res)});
}
return promise.promise;
}
return {
loadSettings: loadSettings
}
}
然后在您的控制器/指令中
angular.controller('MyController', MyController);
function MyController(SettingsService) {
var me = this;
SettingsService.loadSettings(function(res) {
me.settings = res;});
}
您可以使用角度缓存功能,如下所述:https://docs.angularjs.org/api/ng/service/$http("缓存"部分)。
还可以为配置值实现服务,它将加载数据一次,将其存储在本地,并为存储的值提供getter。
相关文章:
- 使用AngularJs时,如何在img标记具有src-attr时设置数据src
- angular.js我如何设置数据什么是响应值
- Highcharts如何显示在设置数据时加载动画
- Ajax请求返回模块设置数据
- 如何在Calendario中从JSON设置数据
- 控制器在设置数据之前获取出厂数据
- 为什么jQuery验证“;远程:“;验证需要一个函数来设置数据值
- 是否可以在CSS中为JS设置数据,以了解某些媒体查询正在应用
- 动态设置数据量属性的值
- 通过后端c#在javascript文件中设置数据
- Sencha Touch 创建无法在单击时销毁弹出窗口 Container.It 创建多个弹出窗口并创建设置数据值的错误
- 无法设置 CKEditor 值;设置数据失败
- 如何在Meteor上使用IronRouter在操作中设置数据
- 解析云 - 在从云返回数据之前设置数据的属性
- 在具有跨源的 iframe 中设置数据属性值
- Angular2:如何在输入元素上动态设置数据绑定变量
- 设置数据样式并使用javascript将其导出为XLS/CSV/PDF
- 关于在 Vue.js 中设置数据对象属性的最佳实践
- 为包定义的模板设置数据上下文
- 如何设置数据幻灯片到,就像我为每个.carousel-indicators li设置id一样