2015-11-03 2 views
0

У меня есть одно поле ввода и пытаюсь получить значение от этого.

<!DOCTYPE html> 
<html ng-app="Application"> 
<head> 
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script> 
<script> 
var app = angular.module('Application', []); 
app.controller('ApplicationRootController', function ($scope) { 
    console.log("[Controller level value - which never come out] $scope.antiForgeryToken_test = " + $scope.antiForgeryToken_test); 
    $scope.SubmitFunction = function(){ 
     console.log("[Value - which come out only after form submitted] $scope.antiForgeryToken_test = " + $scope.antiForgeryToken_test); 
    }; 
}); 
</script> 
</head> 

<body> 
    <form id="ApplicationRoot" 
     ng-controller="ApplicationRootController" 
     ng-submit="SubmitFunction()" > 

     <button type="submit">Submit</button> 

     <div id="AntiForgeryKeyHolder"> 
      <input 
       id="antiForgeryToken_test" 
       ng-model="antiForgeryToken_test"    
       ng-init="antiForgeryToken_test='PassKey123456789'" 
       type="hidden" /> 
     </div> 

    </form> 
</body> 
</html> 

Но то, что я получил это undefined, поэтому я попытался с помощью формы, направляющей, то значение выходит.
Так что мой вопрос:

Как получить значение из этого простого поля ввода без отправки формы?

Plunker

Обновлено

Почему console.log дать мне undefined так же код дают мне значение, когда его называли подав форму?

+0

Я не очень понимаю вопрос. Но ваше использование 'ng-init' неверно, см. Doc https://docs.angularjs.org/api/ng/directive/ngInit. Если вы хотите инициализировать значение модели, вы должны сделать это в самом контроллере. –

+0

Код выглядит прекрасно, в чем проблема? Даже плункер работает нормально. –

+0

@DavidVotrubec, 'ng-init' отлично. – mic4ael

ответ

0

Код, поставленный в поле зрения, выполнен после кода, размещенного в контроллере js. Поэтому, когда контроллер выполнения и вызов линия

console.log("[Controller level value - which never come out] $scope.antiForgeryToken_test = " + $scope.antiForgeryToken_test); 

ng-init ввиду еще не работает.

Для решения этой проблемы можно использовать setTimeout как

setTimeout(function(){ 
    console.log("[Controller level value - which never come out] $scope.antiForgeryToken_test = " + $scope.antiForgeryToken_test); 
}); 

здесь обратный вызов выполняется после задержки, поэтому он может быть после ng-init

updated plunker

+0

Есть ли любое событие, например, «форма загружена полностью», а не «setTimeout»? –

+1

@FrankMyatThu, вы можете увидеть о [событии AngularJs для вызова после загрузки контента] (http://stackoverflow.com/questions/21715256/angularjs-event-to-call-after-content-is-loaded). конечно, если вы используете 'ng-view' – Grundy

0

Дождитесь области контроллера получает нг-инициализации данных от пользовательского интерфейса.

var app = angular.module('Application', []); 

app.controller('ApplicationRootController', function ($scope, $timeout) { 
    $timeout(function(){console.log($scope.antiForgeryToken_test);}, 2000); 
}); 
+0

Есть ли какие-либо события типа' form loaded full', а не 'setTimeout' –

+0

checkout $ viewContentLoaded documentation – venkat7668

0

После того как я получил большое знание от @Grundy code in view - called after code inside controller

Итак, я пытался стрелять код из контроллера только тогда, когда содержание полностью загружен. Мое окончательное решение ниже

angular.element(document).ready(function() { 
     console.log("[Value - After form loaded completly] $scope.antiForgeryToken_test = " + $scope.antiForgeryToken_test); 
}); 

Plunker

+0

не рекомендуется использовать jqLite в контроллере, похоже, вы пытаетесь решить еще одну проблему? почему бы просто не назначить этот токен внутри контроллера? Попытайтесь узнать о [проблемах XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Grundy

+0

@Grundy, мой токен-ключ исходит из кода на стороне сервера ASp.net Razor '.Я не уверен, что 'controller js' может выполнять функцию бритвы' @GetAntiForgeryToken() '. Более подробно на http://techbrij.com/angularjs-antiforgerytoken-asp-net-mvc –

+0

yep, но вы можете сохранить результат для '@GetAntiForgeryToken()' в глобальной переменной и использовать его – Grundy