我正在尝试创建一个用户键入文本的角度表单,而当他执行此操作时,下面的文字说“用户正在键入...”。
然后它等待200毫秒,文本标签变为空白(“用户输入”消失)。
我正在使用角度ng-change指令。 我的代码如下。
问题在于,由于某些原因,我在为它们之间运行2个方法而编写的帮助方法存在问题。 由于某种原因,文字“用户正在打字......”在短暂的睡眠后不会消失。
为什么会这样?
感谢
angular.module('myApp', [])
.controller('myCtrl', ['$scope', function($scope) {
$scope.count = 0;
$scope.myFunc = function() {
runTwoFunctionWithSleepBetweenThem(function (){$scope.text='user is typing...';},function (){$scope.text='';},200);
};
var runTwoFunctionWithSleepBetweenThem = function(foo1,foo2, time) {
var sleep =function (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
foo1();
sleep(time).then(() => {
foo2();
});
}
}]);
<!DOCTYPE html>
<html>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="myCtrl">
<p>Write something in the input field:</p>
<input type="text" ng-change="myFunc()" ng-model="myValue" />
<p>{{text}}</p>
</div>
</body>
</html>
答案 0 :(得分:3)
正如AndréVale和Titus在评论中提到的那样,你已经超出了范围应用程序周期,因此在更新范围后,Angular不知道要进行“脏检查”。
var runTwoFunctionWithSleepBetweenThem=function(foo1,foo2, time) {
var sleep = function (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
foo1();
sleep(time).then(() => {
foo2();
$scope.$apply();
});
}
您的sleep
函数近似https://datatables.net/manual/tech-notes/4,这是基于Promise的;您可以轻松切换到它,并且还可以利用默认情况下它将在$apply
块中调用该函数的事实:
// Inject the $timeout service in your controller.
var runTwoFunctionWithSleepBetweenThem=function(foo1, foo2, time) {
foo1();
$timeout(foo2, time);
}
如果你想让这个完全承诺兼容,如果它返回一个承诺就延迟foo1
,如果它拒绝则中止,那么你可以这样改写它:
// Inject $timeout and $q.
var runTwoFunctionWithSleepBetweenThem=function(foo1, foo2, time) {
$q.when(foo1()).then(() => $timeout(foo2, time));
}
答案 1 :(得分:1)
您可以为此行为定义服务:
array
用法(将[{1}}服务注入app.service('Sleep', Sleep);
Sleep.$inject = [$timeout]
function Sleep($timeout) {
return time =>new Promise((ok) => {$timeout(ok, time);});
}
后):
Sleep
答案 2 :(得分:1)
如果您可以使用下划线,请查看_.debounce。人们对$ scope也是正确的。$ apply();
inner.bat