У меня есть ресурс, данные которого зависят от другого ресурса. 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
на область обратного вызова бесполезной ...
«group.transactions» и другие привязки в порядке, это фрагмент некоторого рабочего кода. Существуют другие привязки к атрибутам 'group.transaction', которые отображаются. Если я вручную установил 'total_installments' некоторое значение перед' '' '' '' '' SplitTransaction.get (...) '', это значение отображается на отображаемом html. По какой-то причине изменение, которое происходит в обратном вызове, не отражает привязку. –
Кстати, 'for' возился с областью, а значение' transaction' имело другой контент при обратном вызове. Но даже переход на '$ .each' не разрешил. –