2014-10-29 6 views
0

Я пытаюсь получить результат запроса http к моему дочернему контроллеру.Как передать результат запроса 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; 
}); 

Я был в состоянии получить результат запроса на мой parentCtrl, но я не знаю, как передать его на мой контроллер ребенка. Может ли кто-нибудь мне помочь?

Спасибо!

+0

'childCtrl' автоматически запускается в своей области после разрешения api-вызова и' parentCtrl' устанавливает переменную области видимости. – Absor

ответ

1

Потенциальные подходы:

1) INJECT myFactory в контроллер ребенка, а также.

2) Доступ к родительской области непосредственно из childCtrl:

$scope.$parent.productDetail 

3) При желании получить доступ из HTML

$parent.productDetail 

Выше предполагает, что вы желаете, чтобы получить доступ к этому значение, в частности, отдельно от потенциальная версия на дочерней области (существующий код этого не показывает).

Если это дочерняя область, и ничто в области дочернего объекта (или области между ними) не называется productDetail, и вы не устанавливаете примитивное значение в области дочерних элементов с этим именем, тогда вы должны иметь возможность см. значение непосредственно через прототипное наследование (но любой из трех перечисленных сценариев может вызвать необходимость ссылки через родителя).

+0

Спасибо, Майк, но $ scope. $ Parent.productDetail и $ parent.produtDetail будет не определено, когда страница будет загружена первой, потому что это HTTP-запросы. Ваш первый подход выполним, но я чувствую, что сделать тот же запрос в разных областях, является избыточным +1, хотя – BonJon

+0

Какое поведение вы хотите? Очевидно, что не будет смысла показывать, пока что-то не решится. Вы можете установить $ scope.productDetail = "" (или любое другое значение по умолчанию, которое вы хотите отобразить, до вызова callApi() и разрешения HTTP). Опять же, это значение будет доступно для всех дочерних областей и будет автоматически обновляться с помощью Angular, когда обещание будет разрешено, а productDetail - в родительском контроллере. – Mike

+0

Взгляните на этот Plnkr: http://plnkr.co/edit/QXBPkqOfqdGmV6B69Ju6?p=preview. Я просто устанавливаю значение productDetail вместо того, чтобы делать http-вызов, но в остальном я думаю, что это, по сути, код, который вы написали. Я сделал одну версию со значением по умолчанию, а другой без нее. Какое поведение вы ожидаете/чего не хотите? Что должно отображаться в области дочернего объекта до вызова и разрешения вызоваApi()? – Mike

Смежные вопросы