Могу ли я улучшить этот фрагмент кода AngularJS / AJAX?
У меня есть следующий общий код.
MyClass.prototype.doSomething = function () {
$.ajax({
url: turl,
dataType: 'jsonp',
success: function (_this) { //closure
return function (data) {
_this._angular_scope.$apply(function () {
_this.property = // extract stuff from 'data'
_this.analyzeContent() // do more stuff with it
})
}
}(this)
})
}
По сути, это обычный AJAX-вызов. Есть...
(1) закрытие для "this", чтобы функция успеха могла иметь доступ к моему объекту и его состоянию
(2) Внутри я возвращаю функцию, которая выполняет что-то с данными, но...
(3) Я хочу, чтобы все, что делает успех, было зафиксировано AngularJS, поэтому эта функция, которая анализирует данные, будет, кроме того, обернуть свои действия в вызове $apply.
Это работает, но я не могу не задаться вопросом, есть ли лучший способ сделать это. Это как раз тот момент, когда мне приходится думать о том, что я делаю, каждый раз, когда я на это смотрю, из-за количества вложенных функций.
Это нормально, или есть лучший рекомендуемый стиль?
1 ответ
Я предполагаю, что этот блок кода находится внутри угловой службы, контроллера или директивы. Если это не так, то есть гораздо более широкий вопрос под рукой. Angularjs поставляется с сервисом $http, который должен использоваться вместо $.ajax здесь. $http предоставляет все те же возможности, что и $.ajax, с дополнительным бонусом в том, что он тестируемый и интегрируется с циклом дайджеста angularjs, поэтому вам не нужно беспокоиться о вещах $scope.$apply(). Я бы сделал что-то вроде следующего:
MyClass.prototype.doSomething = function () {
var self = this;
$http.get( turl ).success( function (data) {
self.property = data.stuff;
self.analyzeContent();
} );
}
Здесь важно помнить, что JavaScript использует функцию, а не блок. Пока объект существует в той же функции, он считается "в области видимости". Поскольку значение this
варьируется в зависимости от контекста, вы можете просто вставить его в переменную (self) и быть уверенным, что значение соответствует ожидаемому.