我一直在使用AngularJS一段时间,并且发现需要每隔一段时间使用$ timeout(似乎通常是初始化一个jQuery插件).
最近,我一直在努力更好,更深入地了解摘要周期,我遇到了$ evalAsync函数.
似乎该函数产生类似的结果$timeout,只有你没有给它延迟.每次我使用$timeout它都会延迟0,所以现在我想知道我是否应该使用它$evalAsync.
这两者之间是否存在根本差异?你会用哪种情况比另一种情况多?我想更好地了解何时使用哪一个.
堆栈跟踪:
Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (file:///android_asset/www/built.min.js:7:22740)
at Object.Scope.$apply (file:///android_asset/www/built.min.js:7:25967)
at navigator.geolocation.getCurrentPosition.that (file:///android_asset/www/built.min.js:13:8670)
at Object.geolocation.getCurrentPosition (file:///android_asset/www/plugins/org.apache.cordova.core.geolocation/www/geolocation.js:122:13)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8589)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8277)
at Object.getCurrentCity (file:///android_asset/www/built.min.js:13:8941)
at Object.$scope.locateDevice (file:///android_asset/www/built.min.js:13:10480)
at file:///android_asset/www/built.min.js:7:12292:7
Run Code Online (Sandbox Code Playgroud)
请参阅此代码http://pastebin.com/B9V6yvFu
getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {
navigator.geolocation.getCurrentPosition(function () {
var that = this,
args = arguments;
if (onSuccess) {
$rootScope.$apply(function () {
onSuccess.apply(that, args);
});
}
}, function () {
var that = this,
args = arguments;
if (onError) {
$rootScope.$apply(function () { …Run Code Online (Sandbox Code Playgroud) 有时我需要$scope.$apply在我的代码中使用,有时它会抛出"正在进行的摘要"错误.所以我开始找到解决这个问题的方法并找到了这个问题:AngularJS:在调用$ scope时预防错误$ digest.$ apply().但是在评论中(以及角度维基上),您可以阅读:
不要做(!$ scope.$$阶段)$ scope.$ apply(),这意味着你的$ scope.$ apply()在调用堆栈中不够高.
所以现在我有两个问题:
防止"正在进行摘要"错误的另一个"解决方案"似乎是使用$ timeout:
$timeout(function() {
//...
});
Run Code Online (Sandbox Code Playgroud)
这是要走的路吗?它更安全吗?所以这是一个真正的问题:如何完全消除"摘要已经在进行中"错误的可能性?
PS:我只使用$ scope.$ apply适用于非同步的非angularjs回调.(据我所知,你必须使用$ scope.如果你想要应用你的更改,请申请$)
我有以下代码:
app.factory('Position', ['$timeout', function() {
var position = {
latitude: 44,
longitude: 26
};
console.log("Timeout started");
$timeout(function() {
position.latitude += 15;
position.longitude += 15;
}, 2000);
return position;
}]);
Run Code Online (Sandbox Code Playgroud)
我进入$timeout not definedJavascript控制台.我没有正确地注入服务的依赖吗?
我正在看一下角度1.2源代码,我只是好奇为什么有些函数以两个美元符号为前缀.这是某种惯例吗?
我试图打电话时遇到这个错误
function MyCtrl1($scope, $location, $rootScope) {
$scope.$on('$locationChangeStart', function (event, next, current) {
event.preventDefault();
var answer = confirm("Are you sure you want to leave this page?");
if (answer) {
$location.url($location.url(next).hash());
$rootScope.$apply();
}
});
}
MyCtrl1.$inject = ['$scope', '$location', '$rootScope'];
Run Code Online (Sandbox Code Playgroud)
错误是
Error: $digest already in progress
Run Code Online (Sandbox Code Playgroud) 在向API发出请求时,我无法在前端更新我的示波器.在后端我可以看到我的$ scope变量的值正在改变,但这并没有在视图中反映出来.
这是我的控制器.
Controllers.controller('searchCtrl',
function($scope, $http, $timeout) {
$scope.$watch('search', function() {
fetch();
});
$scope.search = "Sherlock Holmes";
function fetch(){
var query = "http://api.com/v2/search?q=" + $scope.search + "&key=[API KEY]&format=json";
$timeout(function(){
$http.get(query)
.then(function(response){
$scope.beers = response.data;
console.log($scope.beers);
});
});
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的HTML的片段
<div ng-if="!beers">
Loading results...
</div>
<p>Beers: {{beers}}</p>
<div ng-if="beers.status==='success'">
<div class='row'>
<div class='col-xs-8 .col-lg-8' ng-repeat="beer in beers.data track by $index" ng-if="beer.style">
<h2>{{beer.name}}</h2>
<p>{{beer.style.description}}</p>
<hr>
</div>
</div>
</div>
<div ng-if="beers.status==='failure'">
<p>No results found.</p>
</div>
Run Code Online (Sandbox Code Playgroud)
我尝试了几种解决方案,包括使用$ scope.$ apply(); 但这只会产生常见错误
错误:$ digest已在进行中 …
我正在寻找一些帮助使用webpack的大型AngularJS应用程序.我们正在使用基于功能的文件夹结构(每个功能/页面都有一个模块,它们有控制器,指令).我已成功配置webpack以使其与Grunt一起工作,Grunt生成一个单独的捆绑包.我想创建一个块作为一个大型应用程序,我们想异步加载模块(页面/功能)工件.
我正在浏览一些'code splitting'使用require([deps],fn )语法的webpack示例.但是我无法得到懒散的块.首先,我不知道究竟在哪里,我需要在AngularJS将用户路由到下一页之前导入这些块.我正在努力寻找明确的责任分离.
是否有人向我指出一个示例AngularJS应用程序,其中webpack用于在每个路由后异步加载控制器/指令/过滤器?
我关注的链接很少: 我应该使用Browserify或Webpack来延迟加载1.x https://github.com/petehunt/webpack-howto#9-async-loading http://dontkry.com中的依赖项/posts/code/single-page-modules-with-webpack.html
我使用嵌套时遇到Angularjs问题ng-include与$compile功能.这是错误:
Error: [$injector:unpr] Unknown provider: $rootElementProvider <- $rootElement <- $location <- $anchorScroll <- ngIncludeDirective
Run Code Online (Sandbox Code Playgroud)
我想,我必须$rootElementProvider在编译流程中注入某个地方,但我不知道如何.
这是我的问题的一个问题:http ://plnkr.co/edit/K8iayGXGLx5QwHNNiLZ1?p=preview
所有代码都是必需的,我不能使用指令和控制器,模板也需要像这样缓存.此外,如果有人也知道如何摆脱已经运行的$timeout服务,$digest我将非常感激.
angularjs ×10
javascript ×5
asynchronous ×1
cordova ×1
java ×1
lazy-loading ×1
scope ×1
webpack ×1