2017-01-23 43 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'); 
    }])