2017-01-23 74 views
1

是否可以在Angular中使用反向$watch

我的問題

我用角轉換,我想用一個$http.put對於每個被漏譯。但是,我得到這個錯誤:

"10 $digets() iterations reached" when trying to $http.post() from ng-translate error handler

我的解決方案

爲了解決這個問題,我已經創建了一個數組,我想要把所有缺少的翻譯ID進去。當頁面準備就緒後,我想把數組放到我的後端,在這裏檢查ID並將其保存到數據庫中。

我的問題

但是,我怎麼知道什麼時候該頁面已準備就緒,與其他詞,我怎麼知道什麼時候角度準備缺少的翻譯推入陣?我正在考慮一個反函數$watch,因此,當數組/集合中沒有任何內容寫入時,函數被調用,比方說1秒。 這是可能的,還是有更好的方法來解決這個問題?

我沒有代碼來展示,因爲所有的代碼都像$httparray.push基本功能

+0

當您說「頁面已準備就緒」時,您的意思是在頁面從服務器獲取數據後?如果是這樣,你曾嘗試使用異步函數在第一次返回後運行下一個函數? – Callum

+0

這聽起來像你可能想要的東西像_.debounce或類似的東西。 – Daniel

+0

這是關於等待,直到數據已被檢索,如果您使用$ http操作,您可以簡單地使用'.then()'承諾回調執行代碼,只要成功收到響應。 '$ http.get(「api/someEndpoint」)。then(function(response){this.someControllerArray = response.data});' –

回答

0

有許多解決方案,以檢查是否controller完成獲取和數據綁定到模板,這取決於如果轉換ID字符串是從端點來或最初存在於模板,我建議這些方式:

  • This answer顯示模板使用diectives的
  • This answer正在檢查$viewContentLoaded
  • 您可以使用$timeout沒有確定具體的時間
0

如果你正在一個$http調用某些類型的,你可以使用承諾回調,如then()catch()finally()採取與響應適當行動:

$http.put('api/someEndpoint').then(function(response) { 
    // $scope.someArray.push(response.data); 
    // this.someArray.push(response.data); 
}); 

如果你的翻譯或項目是在你可以在此基礎上answer在NG-重複完成執行功能,併發出EV NG-重複使用$emit使用$on$scope$rootScope收聽。

app.controller('SomeController', function SomeController($scope) { 
    // executed on last iteration of ng-repeat 
    $scope.foo = function() { $scope.$emit('someEvent') }); 

    $scope.$on('someEvent', function() { // event triggered, do something like $http }); 
}); 

這不是完全清楚你如何填充這個ID的項目,但可能是一個辦法。

希望有幫助!

0

這是一個小的演示,我從其他已標記的stackoverflow問題獲得一些想法。https://embed.plnkr.co/anL7unrSAB21hdLPMoxG/

我覺得你並不需要擔心,如果頁面準備好了,因爲在這裏我們勾我們的過程中對翻譯服務的useMissingTranslationHandler。下面是附加演示文件plunck中的一些代碼捕捉

angular 
    .module('app', ['pascalprecht.translate', 'ngCookies']) 
    .service('customTranslationHandlerService', ['$http', function ($http) { 

    this._queue = {}; 

    /* queue items to push to server ....*/ 
    this.pushToQueue = function (missingTranslationId) { 
     if (!this._get(missingTranslationId)) { 
     this._set(missingTranslationId); 
     } 
     this._start(); 
    } 
    }]) 
    .factory('customTranslateMissingTranslationHandlerLog', ['customTranslationHandlerService', function (customTranslationHandlerService) { 

    return function (translationId) { 
     customTranslationHandlerService.pushToQueue(translationId); 
    }; 
    }]) 
    .config(['$translateProvider', function ($translateProvider) { 

    $translateProvider.useMissingTranslationHandler('customTranslateMissingTranslationHandlerLog'); 
    }])