Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript then语句中缺少$scope.$apply-必须手动运行它_Javascript_Angularjs - Fatal编程技术网

Javascript then语句中缺少$scope.$apply-必须手动运行它

Javascript then语句中缺少$scope.$apply-必须手动运行它,javascript,angularjs,Javascript,Angularjs,因此,我试图集中数据服务,在我的应用程序和后端服务之间来回传递所有信息 我的应用程序不会使用ng app=“myApp”自动引导,而是加载加载外部配置文件所需的几个模块,并在引导应用程序之前使用这些模块从服务器获取初始数据。一旦应用程序启动,提要将通过$scope[feedName]=feedData分配给主控制器作用域。因为提要可能会有所不同,所以我这样做是为了确保数据在任何时候都对所有作用域可用 因为我需要能够在这个预引导场景中高效地使用资源,所以我编写了一个名为getDataFrom(ur

因此,我试图集中数据服务,在我的应用程序和后端服务之间来回传递所有信息

我的应用程序不会使用ng app=“myApp”自动引导,而是加载加载外部配置文件所需的几个模块,并在引导应用程序之前使用这些模块从服务器获取初始数据。一旦应用程序启动,提要将通过
$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移到了调用函数中。可悲的是,这也导致了同样的问题。这根本不是你所做的,这根本不使用承诺,我只是说你仍然可以使用它,但你不必这样做。