我正在尝试用Angular替换Knockout。 然而,到目前为止,我似乎无法解决一些怪癖。
在我网站的登录功能中,我进行了ajax调用并获取了一些用户信息, 然后在控制器中设置此信息。
像这样: $scope.login = function () {
var data = {
userName: $('#txtLoginName').val(),
password: $('#txtLoginPassword').val(),
};
console.info(data);
postJSON("/StrengthTracker/User/Login", data, function (result) {
if (result.result == "ok") {
$('#loginDialog').modal('hide');
//setting controller variables <------------
$scope.isLoggedIn = true;
$scope.userId = result.userId;
$scope.userName = result.userName;
$scope.publicId = result.publicId;
$scope.gender = result.gender;
$scope.unitName = result.unit;
console.info(result);
notify("Welcome " + $scope.userName);
}
if (result.result == "fail") {
notifyFail("Login failed");
}
});
}
我可以看到返回了正确的数据,例如,notify(..)调用确实说“Welcome Roger”。到现在为止还挺好。 但似乎Angular并没有看到变量发生了变化。
如果我再次点击登录功能,那么角度会注意到更改,并了解用户已登录。
想法?
答案 0 :(得分:1)
这与AngularJS没有意识到你的回调函数有关,它没有被跟踪。正如Yoshi已经建议的那样,使用$scope.$apply
修复它,因为这会迫使AngularJS意识到。
请注意,AngularJS内置支持使用$http
和$resource
发出AJAX请求(如果是REST服务)。使用其中一个对象的一个优点是您不必手动使用$apply
,另一个是您的代码可以通过内置的单元测试支持来测试。