Javascript 知道何时在控制器中呈现DOM
我正在使用AngularJS,我有一个问题。控制器上有$watch:Javascript 知道何时在控制器中呈现DOM,javascript,angularjs,angularjs-directive,angularjs-scope,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,我正在使用AngularJS,我有一个问题。控制器上有$watch: function MyController() { $watch('myModel', function() { $rootScope.$emit('do-oper'); }); } “myModel”还通过绑定更改了我的DOM 在一项指令中,我有: $rootScope.$on('do-oper', function() { // Do DOM manipulation }); 问
function MyController() {
$watch('myModel', function() {
$rootScope.$emit('do-oper');
});
}
“myModel”还通过绑定更改了我的DOM
在一项指令中,我有:
$rootScope.$on('do-oper', function() {
// Do DOM manipulation
});
问题是,在发出“do oper”时,DOM没有使用更新“myModel”呈现。呈现DOM后如何触发DOM操作?您可以尝试在AngularJS中的app.run内发出事件。我认为在处理像AngularJS这样的MVC结构时,直接操作DOM不是一个好主意。你违反了规则。在MVC中,视图应尽可能被动,监听模型更改以进行相应更新,不应通过代码直接更新视图。控制器中的代码也不应该关心视图的渲染时间 有一种使用$timeout的解决方法,但我建议您不要这样做。重新设计代码以采用MVC模式是更好的解决方案 解决方法可以如下所示:
$rootScope.$on('do-oper', function() {
$timeout(function(){
// Do DOM manipulation
});
});
$rootScope.$on('do-oper', function() {
//Update properties of directive's scope based on the changed `do-oper`
});
angular.element( document ).ready( function() {
$watch('myModel', function() {
$rootScope.$emit('do-oper');
});
);
此解决方案的另一个大问题是,代码可能会无意中更新DOM属性,这些更新可能与angular发生冲突,从而导致不可预测的结果
您可以将指令更改为以下内容:
$rootScope.$on('do-oper', function() {
$timeout(function(){
// Do DOM manipulation
});
});
$rootScope.$on('do-oper', function() {
//Update properties of directive's scope based on the changed `do-oper`
});
angular.element( document ).ready( function() {
$watch('myModel', function() {
$rootScope.$emit('do-oper');
});
);
指令模板绑定到作用域的属性以进行相应更新。如果需要通过angular控制之外的操作响应DOM中的更改,则可能需要检查 特别值得注意的是,在链接函数中,我们看到:
angular.element( document ).ready( function() {
setup();
determiner();
});
这表明您可以更改控制器代码,可能如下所示:
$rootScope.$on('do-oper', function() {
$timeout(function(){
// Do DOM manipulation
});
});
$rootScope.$on('do-oper', function() {
//Update properties of directive's scope based on the changed `do-oper`
});
angular.element( document ).ready( function() {
$watch('myModel', function() {
$rootScope.$emit('do-oper');
});
);
可能感兴趣的进一步阅读:是这样的场景。您有一个指令,它采用modelmyModel,在这种情况下,它呈现一个dom元素。您想通过您的指令来观察模型中的任何更改以重新呈现内容吗?我认为在使用诸如angular这样的MVC结构时,直接操作DOM不是一个好主意。你违反了规则。在MVC中,视图应尽可能被动,监听模型更改以进行相应更新,不应通过代码直接更新视图。控制器中的代码也不应该关心视图的渲染时间。