Привязка данных контроллера AngularJS {{$ ctrl.test}} не работает - PullRequest
0 голосов
/ 27 февраля 2019

Я учу себя AngularJS, пытаясь сделать простое приложение.У меня проблемы с привязкой данных при использовании контроллера.

todo-item.js

'use strict';

angular.module('todoItem', ['ngRoute'])

.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/todoItem', {
    templateUrl: 'todo-item/todo-item.template.html',
    controller: 'TodoItemCtrl'
  });
}])

.controller('TodoItemCtrl', [function() {
  this.test = [1, 2, 3, 4];
}]);

todo-item.template.html

<p>This is the partial for todo item.</p>
<p>
  this is just a test
</p>

<p>{{$ctrl.test}}</p>
<ul>
  <li ng-repeat="i in $ctrl.test">{{i}}</li>
</ul>

То, что я вижу, это отображение веб-страницы:

Это частичное для todo item.

Это всего лишь тест

Так вотуказывает на то, что шаблон визуализируется, однако без зависимой части привязки данных ...

Если я добавлю console.log(this.test) в код контроллера сразу после строки this.test = [1, 2, 3, 4], он выведет объект массива на консольArray(4) [ 1, 2, 3, 4 ].Итак, я знаю, что код контроллера должен работать ...

Чего мне не хватает?

Кроме того, будучи новичком в AngularJS, я пока не знаком с отладкой в ​​этой среде.Как бы вы обычно отлаживали что-то подобное?Могу ли я перейти на консоль и сделать что-то вроде >>$ctrl?


В случае, если это поможет, вот app.js

'use strict';

// Declare app level module which depends on views, and core components
angular.module('todoApp', [
  'ngRoute',
  'todoList',
  'todoItem'
]).
config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) {
  $locationProvider.hashPrefix('!');

  $routeProvider.otherwise({redirectTo: '/todoList'});
}]);

и index.html:

<!DOCTYPE html>

<html lang="en" ng-app="todoApp">
<head>
  <meta charset="utf-8">
  <title>ToDo AngularJS App</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="app.css">
</head>
<body>

  <div ng-view></div>

  <script src="lib/angular/angular.js"></script>
  <script src="lib/angular-route/angular-route.js"></script>
  <script src="app.js"></script>
  <script src="todo-list/todo-list.js"></script>
  <script src="todo-item/todo-item.js"></script>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Один из способов сделать это - использовать код:

.controller('TodoItemCtrl', ['$scope', function($scope) {
  $scope.test = [1, 2, 3, 4];
}]);

и обновить шаблон до:

<p>{{test}}</p>
<ul>
  <li ng-repeat="i in test">{{i}}</li>
</ul>

Лучше использовать $scope с контроллерами какупоминается здесь: это против $ scope

0 голосов
/ 27 февраля 2019

Чтобы ответить на вопрос, избегая $scope и используя вместо этого что-то более изолированное, как предлагают документы AngularJS, компоненты - это путь.

Чтобы добиться этого, я изменил приложение.js для обработки routes и использования components:

'use strict';

// Declare app level module which depends on views, and core components
angular.module('todoApp', [
  'ngRoute',
  'todoList',
  'todoItem'
])
.config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) {
  $locationProvider.hashPrefix('!');

  $routeProvider.
  when('/todoList', {
    template: '<todo-list></todo-list>'
  })
  .when('/todoItem', {
    template: '<todo-item></todo-item>'
  })
  .otherwise({redirectTo: '/todoList'});
}]);

Затем я реализовал component в todo-item.js:

'use strict';

angular.module('todoItem', ['ngRoute'])

.component('todoItem', {
    templateUrl: 'todo-item/todo-item.template.html',
    controller: 'TodoItemCtrl'
})

.controller('TodoItemCtrl', [function() {
  this.test = [1, 2, 3, 4];
}]);

Для использования $scope см. Ответ Анурага Шриваставы .Я не уверен, что лучше, потому что мне нужно многому научиться.

0 голосов
/ 27 февраля 2019

Я думаю, вам может понадобиться указать controllerAs: '$ ctrl' в вашем провайдере маршрутов, поэтому

$routeProvider.when('/todoItem', {
  templateUrl: 'todo-item/todo-item.template.html',
  controller: 'TodoItemCtrl',
  controllerAs: '$ctrl'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...