Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 知道何时在控制器中呈现DOM_Javascript_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Javascript 知道何时在控制器中呈现DOM

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 }); 问

我正在使用AngularJS,我有一个问题。控制器上有$watch:

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中,视图应尽可能被动,监听模型更改以进行相应更新,不应通过代码直接更新视图。控制器中的代码也不应该关心视图的渲染时间。