Angularjs нг-шоу не работает
Я пытаюсь отобразить содержимое div на основе ответа от службы $http. Вызов AJAX работает нормально и здесь не проблема. Однако я не могу обновить переменную контроллера, которую я хотел бы (intFlag) получить желаемое поведение. Я думал, что создание глобальной переменной решит проблему, хотя я не хотел этого делать.
Вот аналогичный вопрос: ( AngularJS: использование ng-show), но решение, которое я видел во многих других местах, похоже, не работает для меня. Это похоже на довольно стандартную процедуру. Сначала я думал, что это просто проблема с областью действия, но даже попытка глобальной переменной не работает. Это может быть потому, что представление не обновляется в ответ на изменения глобальных переменных. Я все еще изучаю Angular.
<html ng-app="myapp">
<head>
<script type="text/javascript">
var intFlag = 0;
var app = angular.module('myapp', []);
app.controller('AController', function ($scope, $http)
{ //I've tried: var this.intFlag = 0; here already
this.CreateUser=function()
{ //scope changes here, right?
$http({
method: 'POST',
url: 'some url', //pseudocode
data: someData, //pseudocode
headers: { 'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(response)
{ intFlag = 1; //global variable
//Ideally I want to update a variable that is in the scope for the controller
}, function errorCallback(response) {
});
};
});
</script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5 /angular.min.js"></script>
</head>
<body ng-controller="AController as Ctrl">
<div>
<button type="button" ng-click="Ctrl.CreateUser()" >Create User</button>
<div ng-show="intFlag === 1">
<p>Congratulations!</p>
</div>
</div>
</body>
</html>
4 ответа
Вам нужно добавить эту переменную в контекст контроллера (this
) как вы используете controllerAs
затем использовать его с псевдонимом контроллера, как Ctrl.intFlag
, Кроме того, я бы сказал, что удалить зависимость $scope от контроллера, который не имеет смысла смешивать $scope
& this
все вместе.
наценка
ng-show="Ctrl.intFlag"
Код
var app = angular.module('myapp', []);
app.controller('AController', function ($http)
{
var self = this;
self.intFlag = intFlag;
self.CreateUser=function()
{ //scope changes here, right?
$http({
method: 'POST',
url: 'some url', //pseudocode
data: someData, //pseudocode
headers: { 'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(response)
{ self.intFlag = 1;//global variable
//Ideally I want to update a variable that is in the scope for the controller
}, function errorCallback(response) {
});
};
});
У вас должна быть переменная контекста контроллера, такая как "self":
контроллер
app.controller('AController', function($scope, $http) { //I've tried: var this.intFlag = 0; here already
var self = this;
self.intFlag = 0;
this.CreateUser = function() { //scope changes here, right?
$http({
method: 'POST',
url: 'some url', //pseudocode
data: someData, //pseudocode
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).then(function successCallback(response) {
self.intFlag = 1; //global variable
//Ideally I want to update a variable that is in the scope for the controller
}, function errorCallback(response) {});
};
});
А затем ссылаться на переменную в контексте следующим образом:
HTML
<div ng-show="Ctrl.intFlag === 1">
Вклад Панкаджа Паркера (который я видел в другом месте, но до сих пор не до конца понял) решил проблему.
Следующие изменения кода получают желаемое поведение.
<html ng-app="myapp">
<head>
<script type="text/javascript">
var app = angular.module('myapp', []);
app.controller('AController', function ($scope, $http)
{ this.intFlag = false; //new code
this.CreateUser=function()
{ var self = this; //new code
$http({
method: 'POST',
url: 'some url',
data: someData,
headers: { 'Content-Type': 'application/x-www-form-urlencoded'}
}).then(function successCallback(response)
{ self.intFlag = true; //new code
}, function errorCallback(response) {
});
};
});
</script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
</head>
<body ng-controller="AController as Ctrl">
<div>
<button type="button" ng-click="Ctrl.CreateUser()" >Create User</button>
<div ng-show="intFlag">
<p>Congratulations!</p>
</div>
</div>
</body>
</html>