2014-01-06 3 views
0

У меня есть ресурс, данные которого зависят от другого ресурса. Transaction привязан к SplitTransaction, который имеет список транзакций. От сделки, мне нужно знать общее количество транзакций SplitTransaction.Устранение зависимости ресурса другого ресурса

Это мой ресурс:

.factory('Transaction', ['$resource', '$http', '$rootScope', 'SplitTransaction', '$q', function($resource, $http, $rootScope, SplitTransaction, $q){ 
    var Transaction = $resource('/api/v1/transaction/:id', {}, { 
     query: { 
      method: 'GET', 
      isArray: true, 
      transformResponse: tastypieDataTransformer($http).concat(function (data, headersGetter) { 
       for (var idx in data) { 
        var transaction = data[idx]; 

        if (transaction.installment_of) { 
         var split = transaction.installment_of.split('/'); 
         var installmentId = split[split.length-1]; 

         SplitTransaction.get({id: installmentId}).$promise.then(function (installment) { 
          transaction.installment_total = installment.transactions.length; 
         }); 
        } 
       } 
       return data; 
      }) 
     } 
    }); 

Это HTML:

<tr class="transaction-row" ng-repeat="transaction in group.transactions"> 
    <td ng-bind="transaction.installment_total"></td> 
</tr> 

Он ничего не показывает на оказанной HTML.

Я пытался использовать обещание:

transformResponse: tastypieDataTransformer($http).concat(function (data, headersGetter) { 
    for (var idx in data) { 
     var transaction = data[idx]; 

     if (transaction.installment_of) { 
      var split = transaction.installment_of.split('/'); 
      var installmentId = split[split.length-1]; 

      var deferred = $q.defer(); 

      SplitTransaction.get({id: installmentId}).$promise.then(function (installment) { 
       var installment_total = installment.transactions.length; 
       deferred.resolve(installment_total); 
      }); 
      transaction.installment_total = deferred.promise; 
     } 
    } 
    return data; 
}) 

Теперь связывание похоже на работу, но он показывает только [object Object] на HTML.

Что я делаю неправильно?

Edit:

Если я устанавливаю transaction.installment_total вне SplitTransaction.get обратного вызова, он показывает на HTML, поэтому привязок в порядке .. Как это:

if (transaction.installment_of) { 
    var split = transaction.installment_of.split('/'); 
    var installmentId = split[split.length-1]; 

    transaction.installment_total = 0; // shows "0" on the html 


    SplitTransaction.get({id: installmentId}, function (installment) { 
     ... 
    }); 
} 

По какой-то причине, что происходит внутри обратного вызова не отражается на привязках ...

Временное решение:

Я удалил код из transformResponse туда, где я загрузить Transaction «S:

Transaction.query(filter).$promise.then(function (result) {      

    $.each(result, function (idx, transaction) {         
     if (transaction.installment_of) {           
      var split = transaction.installment_of.split('/');     
      var installmentId = split[split.length-1];       
      transaction.installment_total = 0;         

      SplitTransaction.get({id: installmentId}, function (installment) { 
       transaction.installment_total = installment.transactions.length; 
      });                 
     }                   
    });                   

    $scope.allTransactions = result;            
    $scope.transactionGroups = groupTransactions($scope.groupBy);     

    window.transactions = $scope.transactionGroups;        

}).finally(function() {$scope.loading = false;}); 

Не могу сказать, почему это работает. Возможно, объекты будут скопированы после transformResponse, что делает мою ссылку на transaction на область обратного вызова бесполезной ...

ответ

0

Не совсем очевидно, что связано с транзакцией .installment_total в вашем html. Обычно это может быть свойство $ rootScope или $ scope связанного контроллера, и я не вижу никакого контроллера здесь.

Кроме того, не очевидно, что такое group.transactions. Если он пуст, тогда ничего не будет сделано.

Но если вам удалось каким-то образом связать transaction.installment_total к вашему HTML, то проблема здесь:

transaction.installment_total = deferred.promise; 

Вы связывании объект Promsie к вашему HTML, и вам необходимо, чтобы связать результат этого обещания:

deferred.promise.then(function(result) { 
    transaction.installment_total = result; 
}); 

То есть, если вы хотите использовать обещания. Но есть и другой способ.

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

Это из documentation:

что пустой результат объекта в кратчайшем рендеринге, когда данные поступают с сервера, то объект заполняется данными и вид автоматически повторно делает себя показывать новые данные. Это означает , что в большинстве случаев один никогда не должно написать функцию обратного вызова для методов

Других слова инициативного ...

var result = SplitTransaction.get({id: installmentId}, function() { 
    transaction.installment_total = result.transactions.length 
}); 

... тоже должно работать.

+0

«group.transactions» и другие привязки в порядке, это фрагмент некоторого рабочего кода. Существуют другие привязки к атрибутам 'group.transaction', которые отображаются. Если я вручную установил 'total_installments' некоторое значение перед' '' '' '' '' SplitTransaction.get (...) '', это значение отображается на отображаемом html. По какой-то причине изменение, которое происходит в обратном вызове, не отражает привязку. –

+0

Кстати, 'for' возился с областью, а значение' transaction' имело другой контент при обратном вызове. Но даже переход на '$ .each' не разрешил. –

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