我发现自从以角度构建应用程序后,我需要手动将页面更新到我的范围.
我知道这样做的唯一方法是$apply()从我的控制器和指令的范围调用.这个问题是它不断向控制台抛出一个错误:
错误:$ digest已在进行中
有谁知道如何避免这个错误或以不同的方式实现相同的事情?
我知道,无论Watchers与Observers就将计算在东西$scope在AngularJS变化.但无法理解两者之间究竟有什么区别.
我最初的理解是Observers为角度表达式计算,这是HTML一侧的条件,Watchers执行$scope.$watch()函数时执行.我在想什么?
我正在写一个Angular 1.5指令,我遇到了一个令人讨厌的问题,试图在绑定数据存在之前对其进行操作.
这是我的代码:
app.component('formSelector', {
bindings: {
forms: '='
},
controller: function(FormSvc) {
var ctrl = this
this.favorites = []
FormSvc.GetFavorites()
.then(function(results) {
ctrl.favorites = results
for (var i = 0; i < ctrl.favorites.length; i++) {
for (var j = 0; j < ctrl.forms.length; j++) {
if (ctrl.favorites[i].id == ctrl.newForms[j].id) ctrl.forms[j].favorite = true
}
}
})
}
...
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在进行AJAX调用以获取收藏夹,然后根据我的绑定表单列表进行检查.
问题是,即使在填充绑定之前,承诺仍在实现......所以当我运行循环时,ctrl.forms仍未定义!
不使用$ scope.$ watch(这是1.5组件的吸引力的一部分)我如何等待绑定完成?
我有一个触发DOM事件的手表:
scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$input.trigger('focus');
}
});
Run Code Online (Sandbox Code Playgroud)
问题是我在'焦点'上有一个处理程序scope.$apply.
$input.bind('focus', function() {
scope.$apply(function() { controller.focused = true; });
});
Run Code Online (Sandbox Code Playgroud)
因此当我$watch从内部触发$digest它时会导致错误,因为它试图触发另一个错误$digest.
我的解决方法是将触发器放入$timeout.
scope.$watch(function() { return controller.selected; }, function(selected) {
if (selected) {
$timeout(function() { $input.trigger('focus'); });
}
});
Run Code Online (Sandbox Code Playgroud)
这工作......到目前为止.这是处理这个问题的正确方法吗?我不确定这是否能抓住每一个案例,并且想知道是否有一个有角度的批准方式让一段代码推迟到摘要之后.
谢谢!
在非常简短的AngularJS $ timeout文档页面上,'delay'参数被声明为可选.当使用$ timeout而没有指定延迟时,我注意到仍然会应用延迟.
任何人都可以告诉我,当论证被隐含时,延迟分配了多少时间?
我需要动态编译 html 并将其作为文本从函数传递。所以,我有这个代码(用于调试目的的简化版本):
angular.module('app', [])
.run(function($rootScope, $compile){
var data = ["1","2"];
var html =
'<div>' +
'<ul>' +
'<li ng-repeat="score in data">{{score}}</li>' +
'</ul>'+
'</div>';
var el = angular.element(html);
$rootScope.data = data;
var result = $compile(el)($rootScope);
console.log(result.html());
})
Run Code Online (Sandbox Code Playgroud)
结果只是:
<ul><!-- ngRepeat: score in data --></ul>
Run Code Online (Sandbox Code Playgroud)
所以,看起来 ngRepeat 不会“重复”“li”元素。
为什么?
JsFiddle: http: //jsfiddle.net/yoorek/K4Cmk/
(我知道 DOM 操作应该在指令等中,并且我知道如何以其他方式进行操作,但我需要理解为什么这不起作用)