2013-05-31 5 views
1

У меня есть следующий общий код.Могу ли я улучшить этот фрагмент javascript 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) закрытие для «этого», так что функция успеха может иметь доступ к моему объекту и его состоянию

(2) Внутри, я возвращаю функцию, которая выполняет что-то на данных, но ...

(3) Я хочу, чтобы все, что удалось сделать, было захвачено AngularJS, поэтому эта функция, которая анализирует данные, будет далее, обернуть ее действия в $ apply call.

Это работает, но я не могу не задаться вопросом, есть ли лучший способ достичь этого. Это правильно в тот момент, когда я должен думать о том, что я делаю каждый раз, когда я смотрю на него из-за количества вложенных функций.

Это нормально, или есть лучший рекомендованный стиль?

ответ

5

Я предполагаю, что этот кодовый блок находится внутри угловой службы, контроллера или директивы. Если это не так, тогда есть гораздо более широкая проблема. 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) и быть уверенным, что это то, что вы ожидаете от этого.

Смежные вопросы