AngularJS: инициализировать вложенные переменные области видимости в контроллере

Мне нравится, чтобы мое пространство имен имен моделей было чистым и описательным, поэтому я использую такие вложенные переменные модели (где месяц и год вложены в сервис):

<form data-ng-submit="submit()">
  <select data-ng-model="service.month" data-ng-options="m for m in months"/>
  <input data-ng-model="service.year"/> {{ service.year }}
  <input type="submit"/>
</form>

И в моем контроллере я хочу установить $scope.service.month и $scope.service.year в начальные значения, но я получаю ошибку javascript Cannot set property 'year' of undefined, поэтому я предполагаю, что DOM не был проанализирован, а все переменные $scope еще не созданы. Как я могу заставить некоторый код ждать запуска, пока DOM не будет проанализирован Angular и все модели не будут созданы?

Вот мой контроллер:

mod.controller('AddServiceCtrl', [
    '$scope', 
    '$rootScope', 
function($scope, $rootScope) {
  var date = new Date();
  $scope.months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
  $scope.service.year = 2014;   
  $scope.submit = function(){
  };
}])

person Tyler    schedule 21.03.2014    source источник


Ответы (2)


 $scope.service= {month:'Mar',year:2014};

AngularJS по-прежнему остается JavaScript.

К сожалению, команда AngularJS решила назвать то, что на самом деле является презентатором (или моделью представления), controller. Это может показаться не таким уж важным, но концептуально это нужно для того, чтобы понять, что controllers делают.

person mpm    schedule 21.03.2014
comment
в качестве альтернативы он может сделать $scope.service = {}, а затем сделать что-то вроде $scope.service.foo = bar - person Zach Lysobey; 21.03.2014

Проблема в том, что объект $scope.service является undefined, поэтому ему не удается определить свойство year внутри контроллера, а не в представлении. Чтобы это работало, вы должны установить объект service в области видимости следующим образом:

$scope.service = {};

затем вы можете определить значения по умолчанию для модели на контроллере или в представлении:

Контроллер

$scope.service = {};
$scope.service.year = 2014;

or

$scope.service = {
    year: 2014,
    month: $scope.months[3]   // to default to 'Apr'
};

Вариант просмотра

<form data-ng-submit="submit()" 
      data-ng-init="service.year=2014; service.month=months[3]">
    ...
</form>

в любом случае вы должны создать объект service в области, чтобы определить в ней свойства. используйте литеральную нотацию объекта ({}) для его создания.

person ryan.l    schedule 21.03.2014