Javascript 在我的例子中,如何传递http请求结果?

Javascript 在我的例子中,如何传递http请求结果?,javascript,angularjs,Javascript,Angularjs,我正在尝试向我的子控制器获取http请求结果 我有点像 <div ng-controller = "parentCtrl"> <button ng-click="callApi()">click me</button> <div ng-controller = "childCtrl"> <div>{{productDetail}}</div> </div> <

我正在尝试向我的子控制器获取http请求结果

我有点像

<div ng-controller = "parentCtrl">
     <button ng-click="callApi()">click me</button>

     <div ng-controller = "childCtrl">
         <div>{{productDetail}}</div>
     </div>
</div>

angular.module('App').controller('parentCtrl', ['$scope','myFactory',
    function($scope, myFactory) {
        $scope.callApi = function() {
            myFactory.request(id)
                .then(function(data) {
                    $scope.productDetail = data
                    //do something in parent controller here....
                })

        }
    }
]);

angular.module('App').controller('childCtrl', ['$scope',
    function($scope) {
        //I am not sure how to get the productDetail data here since it's a http request call.
    }
]);



angular.module('App').factory('myFactory', function($http) {
    var service = {};

    service.request = function(id) {
        return createProduct(id)
            .then(function(obj) {
                productID = obj.data.id;
                return setProductDetail(productID)
            })
            .then(getDetail)
            .then(function(productDetail) {             
                return productDetail.data
            })          
    }
    var createProduct = function(id) {
        return $http.post('/api/product/create', id)
    }

    var setProductDetail = function(id) {
        return $http.post('/api/product/setDetail', id)
    }

    var getDetail = function() {
        return $http.get('/api/product/getDetail')
    }

    return service;
});

点击我
{{productDetail}}
angular.module('App').controller('parentCtrl',['$scope','myFactory',
功能($scope,myFactory){
$scope.callApi=function(){
myFactory.request(id)
.then(功能(数据){
$scope.productDetail=数据
//在父控制器中执行某些操作。。。。
})
}
}
]);
角度.module('App').controller('childCtrl',['$scope',
职能($范围){
//我不知道如何在这里获取productDetail数据,因为这是一个http请求调用。
}
]);
角度.module('App').factory('myFactory',函数($http){
var服务={};
service.request=函数(id){
返回createProduct(id)
.然后(功能(obj){
productID=obj.data.id;
返回setProductDetail(productID)
})
.然后(获取详细信息)
.then(函数(productDetail){
返回productDetail.data
})          
}
var createProduct=函数(id){
返回$http.post('/api/product/create',id)
}
var setProductDetail=函数(id){
返回$http.post('/api/product/setDetail',id)
}
var getDetail=function(){
返回$http.get('/api/product/getDetail')
}
回程服务;
});
我能够获得parentCtrl的请求结果,但我不确定如何将其传递给我的子控制器。有人能帮我吗

谢谢

潜在的方法:

1) 将myFactory也注入子控制器

2) 直接从childCtrl中访问父作用域:

$scope.$parent.productDetail
3) 如果希望从HTML访问

$parent.productDetail
上面假设您希望访问与子作用域上的潜在版本明确分开的值(现有代码没有显示)


如果它是一个子作用域,并且子作用域(或两者之间的作用域)上没有任何名称为productDetail,并且您没有使用该名称在子作用域中设置基元值,那么您应该能够通过原型继承直接看到该值(但列出的三种情况中的任何一种都可能迫使家长提供参考).

childCtrl
在api调用解析和
parentCtrl
设置范围变量后,它会自动在其作用域中。谢谢Mike,但是$scope。$parent.productDetail和$parent.produtDetail在页面第一次加载时将是未定义的,因为它们是http请求调用。您的第一种方法是可行的,但我想让sam这样做不同作用域中的e请求是冗余的+1,但您想要什么行为?显然,在解决某个问题之前,不会有一个值显示。您可以设置$scope.productDetail=“”(或在触发callApi()和http调用解决之前要显示的任何其他默认值)。同样,此值将可用于所有子作用域,并且在父控制器中解析承诺并设置productDetail时,Angular将自动更新此值。请看一下此Plnkr:。我只是设置productDetail值,而不是进行http调用,但除此之外,我认为这本质上就是您编写的代码。我在一个版本中使用了默认值,而在另一个版本中没有默认值。您希望/希望哪些行为不会发生?在调用和解析callApi()之前,子范围中应该显示哪些内容?因此,在我的子范围中,我有一些类似于var desc=$scope.$parent.productDetail.product[0].desc。它告诉我找不到desc error的属性,因为productDetail中还没有任何内容,并且我从调用中返回了多个对象。我相信无论您在父范围还是子范围内,您都会收到此错误。您正在尝试获取不存在对象的属性,因此无论范围如何,它都会抛出错误。如果在尝试访问$scope.$parent.productDetail的组件之前检查$scope.productDetail是否存在,则可以避免此问题。我认为这与父/子作用域无关。请尝试将相同的代码放入父控制器,我相信您会得到相同的错误。