Javascript ajax未在UI中反映后角度更新$scope变量
我似乎无法理解这里的问题。 在ajax成功响应中,我在当前控制器中设置了一个未反映在UI中的值。我发现的一般答案是使用Angular ajax函数运行和/或将$apply或$digest应用于$scope。这些都不起作用 请注意,在代码中,{{和}}角度标记被替换为,因为我正在使用刀片诱惑引擎,并且这些标记冲突 其思想是在控制器中设置一个处理布尔值。ajax之前设置为true,之后设置为false。问题是该值没有返回到错误状态。运行$apply或$digest方法都会返回Javascript ajax未在UI中反映后角度更新$scope变量,javascript,ajax,angularjs,scope,angular-http,Javascript,Ajax,Angularjs,Scope,Angular Http,我似乎无法理解这里的问题。 在ajax成功响应中,我在当前控制器中设置了一个未反映在UI中的值。我发现的一般答案是使用Angular ajax函数运行和/或将$apply或$digest应用于$scope。这些都不起作用 请注意,在代码中,{{和}}角度标记被替换为,因为我正在使用刀片诱惑引擎,并且这些标记冲突 其思想是在控制器中设置一个处理布尔值。ajax之前设置为true,之后设置为false。问题是该值没有返回到错误状态。运行$apply或$digest方法都会返回错误:[$rootSco
错误:[$rootScope:inprog]
在ajax之后,我运行
console.log($scope.processing);
console.log(this.processing);
console.log($scope)代码>
返回
unfind
取消查找
并返回$scope对象。
但是,在控制台中输出的$scope对象中,处理的值与它应该的值相同(false)
然而,它并没有反映在UI中,它仍然是正确的。单击切换按钮将处理值设置为false,并更新UI。
所以我非常困惑问题在哪里
HTML
创建新的度量单位
名称
创建新的度量单位
{!!\xsds::angularLoader('ng-show=“uom.processing”')
切换
app.js
(function( ){
var app = angular.module('ingredients',[], function($interpolateProvider) {
$interpolateProvider.startSymbol('<%');
$interpolateProvider.endSymbol('%>');
});
app.controller('UnitOfMeasureController', ['$scope','$http', function($scope,$http) {
formData = [];
this.processing = false;
this.processForm = function( ){
this.processing = true;
$http.get(document.js_root+'/recipe/ingredients/uom/ajax-create').
success(function(data, status, headers, config) {
/* $scope.$apply(function(){
$scope.processing = false;
});*/
console.log($scope.processing);
console.log(this.processing);
console.log($scope);
$scope.processing = false;
if (!data.success) {
console.log(data.errors);
} else {
console.log('success');
}
//$scope.$digest();
//$scope.$apply(); similar but slower
/* $scope.$apply(function() {
$scope.processing = false;
});*/
}).
error(function(data, status, headers, config) {
$scope.processing = false;
if(document.is_js_dev){
alert(status+' ');
}
});
return false;
};
}]);
})();
(函数(){
var app=angular.module('成分',[],函数($interpolateProvider){
$interpolateProvider.startSymbol(“”);
});
app.controller('UnitOfMeasureController',['$scope','$http',函数($scope,$http){
formData=[];
此项处理=错误;
this.processForm=函数(){
这是真的;
$http.get(document.js_root+'/recipe/components/uom/ajaxcreate')。
成功(函数(数据、状态、标题、配置){
/*$scope.$apply(函数(){
$scope.processing=false;
});*/
log($scope.processing);
console.log(this.processing);
console.log($scope);
$scope.processing=false;
如果(!data.success){
console.log(data.errors);
}否则{
console.log('success');
}
//$scope.$digest();
//$scope.$apply();类似但较慢
/*$scope.$apply(函数(){
$scope.processing=false;
});*/
}).
错误(函数(数据、状态、标题、配置){
$scope.processing=false;
if(document.is_js_dev){
警报(状态+“”);
}
});
返回false;
};
}]);
})();
您的控制器代码应该重置标志
this.processing=false
而不是$scope.processing=false代码>当您使用controllerAs
语法时
另外使用var vm=this;然后使用vm
而不是this
控制器
app.controller('UnitOfMeasureController', ['$scope','$http', function($scope,$http) {
var vm = this;
//then use this in your controller instead of this
}]);
是,var vm=this代码>将是一种方式
或者您可以在成功或错误方法中使用.bind(this)
。使用ES6,您可以使用
请看看这个。与下面相同的演示
var-app=angular.module('components',[],函数($interpolateProvider){
$interpolateProvider.startSymbol(“”);
});
app.controller('UnitOfMeasureController',['$scope','$http',函数($scope,$http){
formData=[];
此项处理=错误;
this.processForm=函数(){
这是真的;
var onSuccess=函数(数据、状态、标题、配置){
/*$scope.$apply(函数(){
$scope.processing=false;
});*/
//log($scope.processing);
console.log(this.processing);
//console.log($scope);
此项处理=错误;
/*如果(!data.success){
console.log(data.errors);
}否则{*/
console.log('success',数据);
//}
//$scope.$digest();
//$scope.$apply();类似但较慢
/*$scope.$apply(函数(){
$scope.processing=false;
});*/
};
var onError=函数(数据、状态、标题、配置){
此项处理=错误;
if(document.is_js_dev){
警报(状态+“”);
}
};
$http.jsonp('http://www.mocky.io/v2/5568b30150223de60c64f24f/?callback=JSON_CALLBACK“)。//document.js_root+”/recipe/components/uom/ajax create”)。
成功(onSuccess.bind(this))。
错误(onError.bind(this));
返回false;
};
}]);代码>
创建新的度量单位
名称
创建新的度量单位
切换
variablethis
在$http.get的success函数中,可能不再是您想要的this
。事实上,这个
可能是你过去认识的人,但现在你忘记了
我已经修改了您的代码以进行演示
app.controller('UnitOfMeasureController', [
'$scope',
'$http',
UnitOfMeasureController
]);
function UnitOfMeasureController($scope,$http) {
var vm = this;
vm.processing = false;
vm.processForm = processForm;
function processForm(){
vm.processing = true;
var url = document.js_root+'/recipe/ingredients/uom/ajax-create';
return $http
.get(url)
.success(function() {
vm.processing = false;
})
.error(function(err) {
vm.processing = false;
});
};
}
但我认为您应该将$http.get部分移动到一个服务,比如RecipeService或任何您想要的名称
看看最佳实践角度风格。这是最新的指南,即使谷歌自己也会参考。添加“This.processing=false”没有任何效果。如果我在控制台中登录“this.processing”的值,在分配之前和之后,我会得到“undefined”和“false”。在哪里
app.controller('UnitOfMeasureController', [
'$scope',
'$http',
UnitOfMeasureController
]);
function UnitOfMeasureController($scope,$http) {
var vm = this;
vm.processing = false;
vm.processForm = processForm;
function processForm(){
vm.processing = true;
var url = document.js_root+'/recipe/ingredients/uom/ajax-create';
return $http
.get(url)
.success(function() {
vm.processing = false;
})
.error(function(err) {
vm.processing = false;
});
};
}