Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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 为什么我尝试在作用域中运行时getElementsByTagName为null。$watch_Javascript_Angularjs_Scope_Watch - Fatal编程技术网

Javascript 为什么我尝试在作用域中运行时getElementsByTagName为null。$watch

Javascript 为什么我尝试在作用域中运行时getElementsByTagName为null。$watch,javascript,angularjs,scope,watch,Javascript,Angularjs,Scope,Watch,我是angularJs的新手。当“localid”被更改时,我试图在链接中重新运行init()函数,但它说 var elm = angular.element(element[0].getSVGDocument().getElementsByTagName("path")); 即使它在第一次加载页面时工作,也为null TypeError:无法读取null的属性“getElementsByTagName” 我在谷歌上搜索了5个多小时,但找不到原因。 我错过了什么 (function() {

我是angularJs的新手。当“localid”被更改时,我试图在链接中重新运行init()函数,但它说

  var elm = angular.element(element[0].getSVGDocument().getElementsByTagName("path"));
即使它在第一次加载页面时工作,也为null

TypeError:无法读取null的属性“getElementsByTagName”

我在谷歌上搜索了5个多小时,但找不到原因。 我错过了什么

(function() {
'use strict';

angular
.module('neuroSeoulFinance')
.directive('seoulmap', seoulMap);

/** @ngInject */
function seoulMap($log) {
var directive = {
    restrict: 'E',
    template: '<object id="seoulmap" class="localMap" data="../assets/images/seoul.svg" type="image/svg+xml" width="80%"></object>',
    replace: true,
    scope: {
        localid : "="
    },
    link: function(scope, element, attrs) {

        var init = function() {
            var elm = angular.element(element[0].getSVGDocument().getElementsByTagName("path"));
            $log.log(elm);
            for(var i=0; i<elm.length; i++) {

                if(elm[i].id == scope.localid.id) {

                    elm[i].style.fill = attrs.highlight;
                }
                else {
                    elm[i].style.fill = "#e1e3e4";                        
                }
            }
        };

        scope.$watch('localid', function(newValue, oldValue) {
            if (newValue){
                init();  // <-- it doesn't work. 
            // var ealm = angular.element(element[0].getSVGDocument().getElementsByTagName("path")); 
            // ^ it also return null..

            $log.log("I see a data change!");
            }
        }, true);

        if(element[0].getSVGDocument()) {
            $log.log("init");
            init();
        } else {
            $log.log("load");
            element.on("load",init);  
        }
    }
};

return directive;
}})();
(函数(){
"严格使用",;
有棱角的
.module('neuroSeoulFinance')
.指令(“seoulmap”,seoulmap);
/**@ngInject*/
函数seoulMap($log){
var指令={
限制:'E',
模板:“”,
替换:正确,
范围:{
本地化:=”
},
链接:函数(范围、元素、属性){
var init=函数(){
var elm=angular.element(元素[0].getSVGDocument().getElementsByTagName(“路径”);
$log.log(elm);
对于(var i=0;i参见

如果getSVGDocument返回null,则表示元素尚未加载,因此如链接中所述,使用超时,并且由于使用angular,因此使用$timeout。

请参阅


如果getSVGDocument返回null,则表示元素尚未加载,如链接中所述,请使用超时,由于使用angular,请使用$timeout。

在元素.on(“加载”)完成后,我更改了$watch代码。 谢谢你的宝贵意见

        if(element[0].getSVGDocument()) {
            init();
        } else {
            element.on("load",function(){   
                scope.$watch('localid', function(newValue, oldValue) {
                if (newValue){
                    init();
                }
                });
            });
        }

在元素.on(“load”)完成后,我更改了$watch代码。 谢谢你的宝贵意见

        if(element[0].getSVGDocument()) {
            init();
        } else {
            element.on("load",function(){   
                scope.$watch('localid', function(newValue, oldValue) {
                if (newValue){
                    init();
                }
                });
            });
        }

您没有正确读取错误消息。
getElementsByTagName
不为null。
getSVGDocument()
返回null。@Epsarello那么,如何从作用域内部访问elm inside init()。$watch()您没有正确读取错误消息。
getElementsByTagName
不为null。
getSVGDocument()
返回null。@那么,我如何从作用域内部访问elm inside init()。$watch()只在$watch()内部调用init()时返回null,而在加载页面时,由于“element.on”(“load”,init)的缘故,它才返回null;”。我的问题是为什么它不在$watch中。我的猜测是,因为您正在查看绑定到父作用域的数据,绑定发生在dom完全加载之前,然后$watch发生在getSVGElement可用之前。只需通过一个(如果getSVGElement()==null)来保护您的init方法即可return;感谢您的评论。问题是,在所有页面完全加载后,用户通过手动进行本地化更改。(当svg文件已经存在时。它需要运行init()每次用户选择不同的localid时函数。我没有说相反的话,我只是说当在呈现指令之前加载指令时,它会在指令和当前视图的控制器之间绑定值。因此$watch会用一个新值触发。这就是为什么会发生这种情况。只需像我说的那样保护您的init方法。您可以在$watch中尝试if(newValue&&oldValue),但我不确定localid的值是否可以为Null,这会给您带来麻烦。它只在$watch内部调用Init()时返回Null,而在加载页面时,由于“element.on”(“load”,Init)的缘故,它会工作;”。我的问题是为什么它不在$watch中。我的猜测是,因为您正在查看绑定到父作用域的数据,绑定发生在dom完全加载之前,然后$watch发生在getSVGElement可用之前。只需通过一个(如果getSVGElement()==null)来保护您的init方法即可return;感谢您的评论。问题是,在所有页面完全加载后,用户通过手动进行本地化更改。(当svg文件已经存在时。它需要运行init()每次用户选择不同的localid时函数。我没有说相反的话,我只是说当在呈现指令之前加载指令时,它会在指令和当前视图的控制器之间绑定值。因此$watch会用一个新值触发。这就是为什么会发生这种情况。只需像我说的那样保护您的init方法。您可以在$watch中尝试if(newValue&&oldValue),但我不确定,如果localid值可以为null,您将遇到问题