2015-11-06 3 views
1

У меня возникли проблемы с этим способом решения множества параметров в контроллере модального, такие как:AngularJs контроллера решительность зависимости

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    resolveInfo : function(REST){ 
    var resolveInfo = {} 
    return REST.doGet('/things/').then(
     function(thingsResponse){ 
     resolveInfo.things = thingsResponse.data; 
     return REST.doGet('/stuff1/' + '/mystuff/' + resolveInfo.things[0].id).then(
      function(stuff1Response){ 
      resolveInfo.stuff1 = stuff1Response.data; 
      return REST.doGet('/stuff2/' + '/mystuff/' + resolveInfo.stuff1[0] + '/' + resolveInfo.things[0].id).then(
       function(stuff2Response){ 
       resolveInfo.stuff2 = stuff2Response.data; 
       return resolveInfo; 
       } 
      ); 
      } 
     );  
     } 
    ) 
    } 

затем в «MyController» я беру эти три объекта из resolveInfo. Но я бы ожидать чего-то, как это будет работать:

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    things : function(REST){ 
    return REST.doGet('/things/').then(
     function(thingsResponse){ 
     return thingsResponse.data; 
     } 
    ) 
    }, 
    stuff1 : function(REST, things){ 
    return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id).then(
     function(stuff1Response){ 
     return stuff1Response.data 
     } 
    ); 
    }, 
    stuff2 : function(REST, stuff1, things){ 
    return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id).then(
     function(stuff2Response){ 
     return stuff2Response.data; 
     } 
    ); 
    } 

Но это вопит неизвестный поставщик на «вещи»

Есть ли способ для достижения этой цели?

+1

Вам нужно использовать $ q.all() ... он будет ждать все ресурсы перед продолжением. –

ответ

1

При использовании параметров ngRoute или ui-router параметры resolve должны либо немедленно вернуть значения, либо возвратить обещание. Проблема с вашим кодом заключается в том, что вы ожидаете, что обещание закончится, прежде чем вернуть значение, которое не будет корректно разрешено.

Javascript Маршрут

Вот обновленный код маршрута, который возвращает обещания.

controller : 'MyController', 
controllerAs : 'vm', 
resolve  : { 
    things : function(REST){ 
    return REST.doGet('/things/'); 
    }, 
    stuff1 : function(REST, things){ 
    return REST.doGet('/stuff1/' + '/mystuff/' + things[0].id); 
    }, 
    stuff2 : function(REST, stuff1, things){ 
    return REST.doGet('/stuff2/' + '/mystuff/' + stuff1[0] + '/' + things[0].id); 
    } 
} 

Java-контроллер

Вот пример контроллера, который может затем использоваться разрешенные параметры.

.controller('MyController', function(things, stuff1, stuff2) {}) 
+0

Это то, что я искал, я не знал ни о разрешенных данных, ни о обещании. Поэтому мне нужно изменить 'things [0] .id' на' things.data [0] .id'или использовать '$ q' в' things: function (REST) ​​', чтобы вернуть новое обещание с обработанными данными , – Illiax

1

Если вы хотите подождать несколько обещаний, вы можете использовать $q.all([promise1, promise2, ...]), однако вы хотите использовать результаты предыдущего обещания.

Основная реструктуризация может решить вашу проблему:

function resolveInfo(REST) { 
    function getThings() { 
     return REST.doGet('/things/').then(
      function (resp) { 
       return getStuff1(resp.data); 
      }); 
    } 

    function getStuff1(things) { 
     return REST.doGet('/stuff1/mystuff/' + things[0].id).then(
      function (resp) { 
       return getStuff2(things, resp.data); 
      }); 
    } 

    function getStuff2(things, stuff1) { 
     return REST.doGet('/stuff2/mystuff/' + stuff1[0] + '/' + things[0].id); 
    } 

    return getThings(); 
} 

Таким образом, вы возвращающий с обещанием в обработчике then посыла для цепочки обещаний. Вот соответствующие документы по этой теме: http://solutionoptimist.com/2013/12/27/javascript-promise-chains-2/

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