Как установить свойство scope с помощью ng-init?

Я пытаюсь установить значение свойства $scope с помощью ng-init, и я не могу получить доступ к этому значению в javascript контроллера. Что я делаю не так? Вот скрипка: http://jsfiddle.net/uce3H/

Разметка:

<body ng-app>
    <div ng-controller="testController" >
        <input type="hidden" id="testInput" ng-model="testInput" ng-init="testInput='value'" />
    </div>
    {{ testInput }}
</body>

JavaScript:

var testController = function ($scope) {
     console.log($scope.testInput);
}

В javascrippt $scope.testInput undefined. Не должно быть "value"?

Ответ 1

Вы пытаетесь прочитать заданное значение до того, как будет выполнено назначение Angular.

Демо:

var testController = function ($scope, $timeout) {
    console.log('test');
    $timeout(function(){
        console.log($scope.testInput);
    },1000);
}

В идеале вы должны использовать $watch, как предложено @Beterraba, чтобы избавиться от таймера:

var testController = function ($scope) {
    console.log('test');
    $scope.$watch("testInput", function(){
        console.log($scope.testInput);
    });
}

Ответ 2

Просто установите ng-init как функцию. Вам не нужно использовать часы.

<body ng-controller="MainCtrl" ng-init="init()">
  <div ng-init="init('Blah')">{{ testInput }}</div>
</body>

app.controller('MainCtrl', ['$scope', function ($scope) {
  $scope.testInput = null;
  $scope.init = function(value) {
    $scope.testInput= value;
  }
}]);

Вот пример.

Plunker

Ответ 3

HTML:

<body ng-app="App">
    <div ng-controller="testController" >
        <input type="hidden" id="testInput" ng-model="testInput" ng-init="testInput=123" />
    </div>
    {{ testInput }}
</body>

JS:

angular.module('App', []);

testController = function ($scope) {
    console.log('test');
    $scope.$watch('testInput', testShow, true);
    function testShow() {
      console.log($scope.testInput);
    }
}

Fiddle

Ответ 4

Попробуйте этот код

var app = angular.module('myapp', []);
  app.controller('testController', function ($scope, $http) {
       $scope.init = function(){           
       alert($scope.testInput);
   };});

<body ng-app="myapp">
      <div ng-controller='testController' data-ng-init="testInput='value'; init();" class="col-sm-9 col-lg-9" >
      </div>
</body>

Ответ 5

Как и CodeHater, вы получаете доступ к переменной до ее установки.

Чтобы исправить это перемещение, директива ng-init для первого div.

<body ng-app>
    <div ng-controller="testController" ng-init="testInput='value'">
        <input type="hidden" id="testInput" ng-model="testInput" />
       {{ testInput }}
    </div>
</body>

Это должно сработать!

Ответ 6

У меня были проблемы с $scope.$watch, но после большого тестирования я узнал, что мой data-ng-model="User.UserName" был плохо назван, и после того, как я изменил его на data-ng-model="UserName", все сработало нормально. Я ожидаю, что это будет . в названии, вызывающем проблему.