Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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范围_Javascript_Angularjs_Angularjs Scope_Angular Promise - Fatal编程技术网

角度/Javascript范围

角度/Javascript范围,javascript,angularjs,angularjs-scope,angular-promise,Javascript,Angularjs,Angularjs Scope,Angular Promise,我试图公开从承诺的成功方法中获得的数据。简而言之,我不知道如何获取$scope.storedData。就目前而言,它是未定义的 genericService.js genericController.js 如何将$scope.storedData公开到storeData()或genericService.success()之外的范围 注意:我不想使用$watch。我想从角度上解决这个范围问题。。。因为这应该是可能的。我通常会做两件事: 我使用的模型定义了预期的响应,通常会使用空模型初始化控制器

我试图公开从承诺的成功方法中获得的数据。简而言之,我不知道如何获取
$scope.storedData
。就目前而言,它是未定义的

genericService.js genericController.js 如何将
$scope.storedData
公开到
storeData()
genericService.success()
之外的范围


注意:我不想使用
$watch
。我想从角度上解决这个范围问题。。。因为这应该是可能的。

我通常会做两件事:

  • 我使用的模型定义了预期的响应,通常会使用空模型初始化控制器
  • 我使用一个变量来跟踪我的状态
  • 下面是我的控制器的示例:

    myApp.controller('genericController', GenericController);
    
    GenericController.$inject = [
       '$scope',
       'genericService'
     ];
    
     function GenericController(
        $scope,
        genericService
     ) {
           $scope.loadData = loadData;
           $scope.storeData = storeData;
    
           init();
    
           ///////////////////
    
           function init() {
               $scope.isLoaded = false;
               $scope.storedData = {}; // if you use a model class, a new instance of this works best.
           }
    
           function loadData() {
               genericService.success(function(data){
                   $scope.storeData(data); 
                   $scope.isLoaded = true;
               });
           }
    
           function storeData(whatever) {
               $scope.storedData = whatever;
           }
     }
    

    它是未定义的,因为genericService是异步的。一旦启动
    success
    回调,就会定义它。如果将记录器移动到回调中,您将看到它工作。但是,只要启动
    success
    回调,我就会调用storeData()。一旦我进入storeData()内部,我就脱离了
    success
    的上下文,您不能有2个success callback当然可以!我已经测试过了。它起作用了。我实际上是在
    promise=genericService.success('someurl')
    上执行回调。因此,我将返回承诺,即
    $http.jsonp('http://foo.com/bar.json)
    ,到
    genericService()
    (这是一个函数)。因此,执行
    genericService()
    将返回一个承诺。承诺有两种方法:
    success()
    error()
    。我只是在genericService.js中为
    suces()
    方法提供一个回调,在genericscontroller.js中提供另一个回调。Travis,如果您要编写另一个函数
    printData(data){console.log(data);}
    ,并在
    genericService.suces()
    方法完成执行后尝试执行此函数,是否会定义
    $scope.storedData
    ?您似乎已在
    storeData(无论什么)
    中更改了
    $scope.storedData
    的值。本质上,我想做的是将
    suces()
    方法返回的数据存储到
    $scope.storedData
    中,以便在服务器响应我的信息请求后,该数据可用。@fuzzybear3965:
    .success()
    不会返回数据。不,这是,因为回调将异步执行。@Bergi,谢谢你用两句话澄清我的问题。老实说,我没有尝试答案。他们似乎不想工作。你的回答没有白费。你的链接让我得到了我现在正在阅读的所有链接:和[续…]和。
    myApp.controller('genericController', ['$scope','genericService', 
         function($scope, genericService){
    
             genericService.success(function(data){
                 $scope.storeData(data); 
             });
    
             $scope.storedData; // Undefined here.
    
             $scope.storeData = function(whatever){
                  $scope.storedData = whatever;
             }
    
             console.log('data stored is: ', $scope.storedData); // Still undefined
    }]);
    
    myApp.controller('genericController', GenericController);
    
    GenericController.$inject = [
       '$scope',
       'genericService'
     ];
    
     function GenericController(
        $scope,
        genericService
     ) {
           $scope.loadData = loadData;
           $scope.storeData = storeData;
    
           init();
    
           ///////////////////
    
           function init() {
               $scope.isLoaded = false;
               $scope.storedData = {}; // if you use a model class, a new instance of this works best.
           }
    
           function loadData() {
               genericService.success(function(data){
                   $scope.storeData(data); 
                   $scope.isLoaded = true;
               });
           }
    
           function storeData(whatever) {
               $scope.storedData = whatever;
           }
     }