Что такое 'this' эквивалент $scope. $Применяется в AngularJS?

В AngularJS есть два стиля написания контроллеров: "контроллер как синтаксис" и "привязка к $scope" стиля контроллера "(оба цитаты из Документация ngController.) Есть несколько вопросов по StackOverflow, которые сравнивают эти стили, например this vs $scope в контроллерах AngularJS и Различия в производительности между функциями контроллера, определенными на $scope или this - AngularJS.

У меня есть метод на контроллере, который должен вызывать AngularJS после обновления модели. Используя стиль $scope контроллера, я могу это сделать:

myApp.controller('MainController', ['$scope', function($scope) {
    $scope.content = "[Waiting for File]";
    $scope.showFileContent = function(fileContent) {
        $scope.content = fileContent;
        $scope.$apply();
    };
}]);

Но если я напишу контроллер, используя 'this'

myApp.controller('MainController', function () {
    this.content = "[Waiting for File]";
    this.showFileContent = function(fileContent){
        this.content = fileContent;
    };
});

как мне вызывать $apply()?

Ответ 1

Если вам действительно нужно $scope, вы все равно можете его ввести. Предполагая синтаксис "контроллер как":

myApp.controller('MainController', function($scope) {
   this.content = "[Waiting for File]";
   $scope.$apply(); // etc.
});

Вопрос в том, действительно ли вам нужно запустить $scope.$apply()? Предполагая, что вы правильно используете его в синтаксисе "контроллер как", он должен увидеть его:

<div ng-controller="MainController as main">
  <div id="content">{{main.content}}</div>
</div>

Затем div#content будет обновляться при обновлении var this.content. Имейте в виду, что вам нужно быть осторожным, как вы используете this, поэтому вам может понадобиться:

myApp.controller('MainController', function($scope) {
   var that = this;
   this.content = "[Waiting for File]";
   this.showFileContent = function(fileContent){
       // 'this' might not be set properly inside your callback, depending on how it is called.
       // main.showFileContent() will work fine, but something else might not
       that.content = fileContent;
   };
});