Как работать с $ctrl. в АнгулярДжС?

У меня есть метод из API. Он возвращает обещание, которое разрешается в объект $ctrl(?). Эти объекты должны содержать измерение и будут обновляться при получении новых данных.

getMeasurements.latest(filter)     //only a object to filter through all measurements
    .then(function (latestMeasurement) {
        $ctrl.latestMeasurement = latestMeasurement;
});

Моя проблема в том, что я не знаю, как работать с этими данными или отображать их в моем html-файле. Как работает $ctrl?

Здесь документация API


person Gabriel W.    schedule 10.10.2017    source источник


Ответы (2)


$ctrl — это объект модели представления в вашем контроллере. Это $ctrl — это имя, которое вы выбираете (vm — еще одно наиболее распространенное имя), если вы проверите свой код, вы увидите определение как $ctrl = this;, так что в основном это >this ключевое слово функции контроллера.

Так что теперь, если вы используете $ctrl.latestMeasurement = 'someValue', то это похоже на то, что вы добавляете свойство latestMeasurement в функцию контроллера.

Теперь, как использовать его в HTML?

Чтобы получить доступ к свойству lastMeasurement в HTML, ваш код должен иметь <h1>{{$ctrl.latestMeasurement}}</h1> (тег H1 — это просто пример).

Здесь $ctrl отличается от того, что я объяснил выше в части контроллера. Здесь $ctrl — это значение, используемое для свойства controllerAs контроллера. Но $ctrl является значением по умолчанию для свойства controllerAs, поэтому в вашем коде может не быть определено свойство controllerAs, поэтому Angular примет значение по умолчанию $ctrl в HTML.

Здесь большинство людей путаются. Итак, позвольте мне объяснить,

Предположим, что в новом контроллере вы объявили ключевое слово this переменной vm и установили для свойства controllerAs значение myCtrl, т.е.

controllerAs: 'myCtrl' при определении свойств контроллера.

var vm = this; в вашей функции контроллера.

В этом случае в js вы должны использовать vm для установки значений, а в HTML вы должны использовать myCtrl. Например,

в функции контроллера JS vm.test = 'Hello world';

в HTML <span ng-bind="myCtrl.test"></span>

Результат Hello world будет отображаться на вашей странице.

Почему $ctrl, а не $scope?

Концепция объектной модели модели представления представлена ​​в AngularJS 1.5, она фактически является частью перехода на Angular 2, где $scope больше не существует. Итак, в 1.5 они представили новый подход, но не удалили $scope полностью.

Надеюсь, ответ помог.

Основные понятия Javascript см. на странице http://javascriptissexy.com/16-javascript-concepts-you-must-know-well/

Более подробную информацию о концепции AngularJS $ctrl см. на странице https://johnpapa.net/angularjss-controller-as-and-the-vm-variable/

person Amir Suhail    schedule 11.10.2017
comment
Это может быть так просто. Спасибо за подробное объяснение. - person Gabriel W.; 11.10.2017
comment
Но $ctrl является значением по умолчанию для свойства controllerAs, поэтому в вашем коде может не быть определено свойство controllerAs, поэтому Angular примет значение по умолчанию $ctrl в HTML. ‹‹‹ Moneyball. - person ruffin; 18.02.2021

Я полагаю, вы говорите об это.

В этом случае

$ctrl.latestMeasurement

может означает:

$ctrl, контроллер, на котором вы запускаете этот код. Вы можете изменить его, например, с помощью $scope и получить тот же результат.

latestMeasurement, переменная, в которой вы хотите сохранить последнее значение измерения.

Чтобы объяснить мою точку зрения, давайте посмотрим на код ниже

<div ng-app="MeasurementApp">
  <div ng-controller="MeasurementController">
    <h1>{{latestMeasurement2}}</h1>
  </div>
</div>

Там вы можете увидеть простое приложение angularjs, которое показывает переменную с именем lastMeasurement2 в div и ее контроллер с именем MeasurementController. Затем, чтобы отобразить значение, проверьте ваш код.

angular.module('MeasurementApp', [])
  // creating the controller 
  .controller('MeasurementController', function(c8yMeasurements, $scope) {
      // creating the variable and let it empty by now.
      $scope.latestMeasurement2 = "";
      // Your code 
      var filter = {
        device: 10300,
        fragment: 'c8y_Temperature',
        series: 'T'
      };
      var realtime = true;
      c8yMeasurements.latest(filter, realtime)
         .then(function (latestMeasurement) {
                // The latestMeasurement is where the measurement comes
                // Here we just assign it into our $scope.latestMeasurement2
               $scope.latestMeasurement2 = latestMeasurement;
      }); 
   });

Как говорится в документации

   // $scope.latestMeasurement2 will be updated as soon as a new measurement is received.
   $scope.latestMeasurement2 = latestMeasurement;

Надеюсь это поможет!

person Jorge    schedule 10.10.2017
comment
$ctrl, the controller where you are running this code. You can change it by $scope for example, and get the same result. Не совсем так. В последних (по-моему, после 1.4) версиях AngularJS контроллер компонента по умолчанию имеет значение $ctrl, и вы должны получить доступ к свойству в шаблоне как таковому. $scope неявно добавляет свойство в область действия шаблона, и к нему можно получить прямой доступ. - person Phix; 10.10.2017
comment
Я работаю с AngularJS уже несколько недель. Я уже пытался изменить $ctrl на $scope. Я получаю только пустой объект. Поэтому я подумал, что мне нужно использовать $ ctrl. Но я не знаю, как на самом деле. - person Gabriel W.; 11.10.2017