加载第一页加载服务 - AngularJS
与AngularJS和JS在一般情况下很新,所以裸露在我身边。加载第一页加载服务 - AngularJS
我得到了它处理日期格式转换的简单AngularJS服务:
'use strict';
angular.module('myApp')
.service('DateUtils', function() {
/**
* Convert US -> EU date format OR EU -> US data format
* @param date Date format yyyy-MM-dd OR dd-MM-yyyy
* @returns {*} opposite of input
*/
this.simpleDateFormatConverter = function (date) {
if (date) {
var benchmark = date.substr(0, 4);
// Check wether the first four digits are integers (US)
var matches = benchmark.match("^[0-9]*$");
// if the date is US simple date format (yyyy-MM-dd)
if (matches != null) {
var year = date.substr(0, 4);
var month = date.substr(5, 2);
var day = date.substr(8, 2);
// US -> EU
return day + "-" + month + "-" + year;
} else {
var year = date.substr(6, 4);
var month = date.substr(3, 2);
var day = date.substr(0, 2);
// EU -> US
return year + "-" + month + "-" + day;
}
} else {
return null;
}
}
});
案例:我有一个编辑页面,正在充满了实体的现有数据。 (在这种情况下,出生日期以美国格式)。在我的控制器中,如下所示,我正在注入该服务并使用其功能来转换实体Author的birthDate。
访问编辑页面时,出生日期为美国格式,但刷新页面时,会按照希望进行转换。
'use strict';
angular.module('myApp')
.controller('AuthorEditController',
['$scope', '$stateParams', 'entity', 'Author', '$state', 'DateUtils',
function ($scope, $stateParams, entity, Author, $state, DateUtils) {
$scope.error = null;
$scope.author = entity;
$scope.load = function (id) {
Author.get({id: id}, function (result) {
$scope.author = result;
});
};
// Only working on page reload
$scope.author.birthDate = DateUtils.simpleDateFormatConverter($scope.author.birthDate);
$scope.save = function() {
// save author
};
}]);
是否因为我的数据尚未正确加载,因此当时未定义的数据不能被服务操纵?
我怎样才能确保这是动态完成的第一页加载?
由于提前,
这是因为Author.get()返回一个promise
,因此在分离线程的解决。为了您的代码工作,你应该叫日期转换器的回调函数里面,像这样:
$scope.load = function (id) {
Author.get({id: id}, function (result) {
$scope.author = result;
$scope.author.birthDate = DateUtils.simpleDateFormatConverter($scope.author.birthDate);
});
};
如果你不熟悉的诺言,你可能要在继续之前做一些研究。
看看: http://andyshora.com/promises-angularjs-explained-as-cartoon.html
有几件事情正在进行。您正在以异步方式加载作者对象,这意味着包含指定$scope.author = result;
的回调函数在大多数情况下会在发生转换时触发。正如@Italo Ayres所回答的,您应该在回调函数中执行转换。
行为数据被刷新页面可能是另一个问题后,正确地转换:
看来,Author
服务缓存结果,并返回先前返回的对象。所以请注意,您只是修改了仍在Author
服务控制之下的对象。当您在其他地方使用该服务时,这可能会导致很难跟踪错误。考虑将您的转换放入服务中(如果这是有意的),或者对您给予的项目进行深层克隆以不影响其他人。如果它只是一个用户界面问题,您还可以添加一个函数,该函数仅转换数据以显示它,而不用修改对象。想想当你保存时对象发生了什么 - 你真的想保存格式化的日期值吗?
生日是作为欧盟日期格式(dd-MM-yyyy)输入的,它使用AngularJS转换为美国日期格式(yyyy-MM-dd)。这是因为mySQL数据库中的日期数据类型。在UI上显示时,美国日期格式代码(从te服务器)再次由AngularJS转换为EU日期格式。 – Lobato
使用filter日期是建议多使用工厂
angular.module('myApp').filter('DateUtils', function (date) {
if (date) {
var benchmark = date.substr(0, 4);
// Check wether the first four digits are integers (US)
var matches = benchmark.match("^[0-9]*$");
// if the date is US simple date format (yyyy-MM-dd)
if (matches != null) {
var year = date.substr(0, 4);
var month = date.substr(5, 2);
var day = date.substr(8, 2);
// US -> EU
var result= day + "-" + month + "-" + year;
} else {
var year = date.substr(6, 4);
var month = date.substr(3, 2);
var day = date.substr(0, 2);
// EU -> US
var result= year + "-" + month + "-" + day;
}
} else {
var result= null;
}
return function (result) {
return result;
}
}
});
HTML:
<p>{{yourDate | DateUtils }}</p>
也有天然的角日期formats
我把它当成一项服务,这是否也是错误的? – Lobato
@Buggyy使用过滤器将避免你问这个问题:“是否因为我的数据没有被正确加载”:),就是这样。 – ProllyGeek
小心使用线程通信ENT。 JavaScript是单线程的。回调将在同一个线程中调用,但在另一个时间。 –
是的,在技术分析中,JS脚步是假的并行。但通过编程方式,它将与线程相同,因此似乎没有必要指出它。感谢您的领导! –
已经试过这个,不起作用 – Lobato