2013-12-11 41 views
0

当使用_.debounce()restangular时,我在角度v1.1.5中遇到了一个奇怪的错误。 它在调用下一个debounce之前不会触发重复请求,这很奇怪。我做了一个plunker演示为您的观看乐趣。当使用_.debounce()和angular v1.1.5时,Restangular请求被暂停

我用最新版本的角度测试它,它的工作原理。很遗憾,我无法升级。所以我想知道是否有人知道发生了什么事情以及可能的解决方法。

这是麻烦的指令(不介意的要求目标,我只是需要一些公共API对查询):

app.directive('delayed', function(Restangular) { 
    return { 
    require: 'ngModel', 
    link: function(scope, element, attrs, c) { 
     var request = function(someValue) { 
     $('#expected-output').append('Delayed execution: ' + someValue + '<br/>'); 
     $('#actual-output').append('Delayed execution: ' + someValue + '<br/>'); 

     var params = { 
      client_id: 'GY4W5CTM20CNKUYWQ0AO1FZEW3H0SMAS1EI5QEHRL3RJZVYG', 
      client_secret: 'CKWHBUAKO2MQF4OTWCKLPIS4WQOZLKBRFKVP5NSVTHHWXXXH' 
     }; 
     var venueId = '40a55d80f964a52020f31ee3'; 

     Restangular.one("venues", venueId).get(params) 
      .then(function(data) { 
      $('#actual-output').append('Success: ' + someValue + '<br/>'); 
      }); 
     $('#expected-output').append('Success: ' + someValue + '<br/>'); 
     }; 
     var delayedRequest = _.debounce(request, 1000); 

     c.$parsers.unshift(function(someValue) { 
     delayedRequest(someValue); 
     }); 
    } 
    }; 
}); 

If you missed the demo link, well here it is again :)

回答

2

当你打电话去抖,你需要给呼叫添加safeApply

您不能仅仅添加$apply,因为对于该函数的其中一个调用者,可能会立即调用它,但对于其他调用者则不会。如果立即调用它,调用$ apply将会失败,因此safeApply仅在需要时运行$ apply。

您需要运行$ apply,因为在大多数情况下,debounce是不同的“javascript转向”或ANgularJS一无所知的事件(如果您使用的是jQuery插件)。

我分叉你的例子,现在它的工作原理:http://plnkr.co/edit/527s0KwAnyZwGmnhUm4f