Javascript then语句中缺少$scope.$apply-必须手动运行它
因此,我试图集中数据服务,在我的应用程序和后端服务之间来回传递所有信息 我的应用程序不会使用ng app=“myApp”自动引导,而是加载加载外部配置文件所需的几个模块,并在引导应用程序之前使用这些模块从服务器获取初始数据。一旦应用程序启动,提要将通过Javascript then语句中缺少$scope.$apply-必须手动运行它,javascript,angularjs,Javascript,Angularjs,因此,我试图集中数据服务,在我的应用程序和后端服务之间来回传递所有信息 我的应用程序不会使用ng app=“myApp”自动引导,而是加载加载外部配置文件所需的几个模块,并在引导应用程序之前使用这些模块从服务器获取初始数据。一旦应用程序启动,提要将通过$scope[feedName]=feedData分配给主控制器作用域。因为提要可能会有所不同,所以我这样做是为了确保数据在任何时候都对所有作用域可用 因为我需要能够在这个预引导场景中高效地使用资源,所以我编写了一个名为getDataFrom(ur
$scope[feedName]=feedData
分配给主控制器作用域。因为提要可能会有所不同,所以我这样做是为了确保数据在任何时候都对所有作用域可用
因为我需要能够在这个预引导场景中高效地使用资源,所以我编写了一个名为getDataFrom(url,data,method)
的小函数来获取数据
看起来是这样的:
getDataFrom = function(url, data, method){
// Create the resource object to get the data using the supplied parameters
var getData = $resource(url, $.extend(data, {"callback": "JSON_CALLBACK"}), {query: {method: method}});
// Return the promise immediately
return getData.query().$promise;
};
在这种情况下,它非常有效。现在,在引导我的应用程序之前,我分配了几个常量,这个函数就是其中之一:
app.constant(“getDataFrom”,getDataFrom)代码>
然后,每当模块需要发送/接收数据时,都会将其作为依赖项包括在内:
.controller('myController',函数($scope、$rootScope、$location、$sanitize、getDataFrom)
从这里,我可以简单地打一个这样的电话:
getDataFrom(myUrl,{myData:equalthis},“JSON”)。然后(result){//do stuff})
我遇到的问题发生在这个场景的部分。如果我执行任何涉及范围的操作,例如$location.path('/newpath')
或$scope.value=newValue
,除非我手动运行$scope.$apply()
,否则不会发生这些操作。因为这应该是一种简单的数据处理方式,所以这显然不会减少它
有人能给我解释一下为什么我的then
缺少自动运行的$scope.$apply
总线吗
这是如何被称为:
getDataFrom(
$scope.app.services.myService,
{"myData": input.val()}
, "JSON")
.then(function(result){
if (result.data && result.data.length > 0){
$scope.results = result.data;
list.show();
}
})
因为您使用的是$resource服务,所以只需执行以下操作即可
return getData.query();
$resource actions返回一个空对象/数组(取决于将isArray设置为什么),请求解析后将填充该对象/数组
所以如果你的服务是
getDataFrom = function(url, data, method){
var getData = $resource(url,
$.extend(data, {
"callback": "JSON_CALLBACK"
}), {
query: {method: method}
}
);
return getData.query();
};
在控制器中,您可以简单地执行以下操作
$scope.someVar = getDataFrom(/*...*/);
如果在请求完成后仍需要执行其他工作,只需从对象访问$PROMITE即可
$scope.someVar.$promise.then(function(){
/* do other stuff */
});
您知道您可以只返回getData.query().$promise
,因为它是一个promise对象,不需要创建一个全新的deferred@PatrickEvans这能解决我的问题吗?我会用什么代码来代替当前的解析和拒绝?我相信$promise是在一个摘要周期内处理的,您必须进行测试以确保。至于解析/拒绝,只需删除该代码并执行以下操作:return getData.query().$promise代码>啊,好的,我现在知道了。这并不能解决问题,但更干净。调用注入方法不应该影响摘要循环是否自动发生。我想我们需要知道您是如何触发控制器中调用getDataFrom()
的代码的。这正是我已经在做的事情,只是您将$promise从return移到了调用函数中。可悲的是,这也导致了同样的问题。这根本不是你所做的,这根本不使用承诺,我只是说你仍然可以使用它,但你不必这样做。