【问题标题】:Make sure object is defined before calling function - angularJS确保在调用函数之前定义对象 - angularJS
【发布时间】:2016-07-08 17:52:29
【问题描述】:

我目前正在为我的项目实现anno.JS,我遇到以下问题:我的控制器在构造函数中无法访问的变量中获取对象的配置(但例如在$onInit 函数中) .但是我有一个问题:

定义我的 anno 如下

this.anno1 = new AnnoModule.Anno(this.annoConfig);

通常有效,因此定义有效,但不知何故(当我调用 this.anno1.show() 时,它说 Cannot read property 'show' of undefined,当我查看开发人员工具时,我可以看到 anno1 未定义,所以我会以某种方式需要确保在调用 show 函数之前定义了 anno。

目前我在init中有定义,所以

$onInit(){
    this.anno1 = new AnnoModule.Anno(this.annoConfig);
}

然后我就有了函数

showAnno(){
    this.anno1.show();
}

在单击按钮时调用。

如何确保已定义 anno?

编辑: 正如我所说,单击按钮时会调用 showAnno(),现在我尝试在使用特殊 get 参数加载页面时自动调用该函数,并且它可以工作。此外,在开发人员工具中,您看到 this.anno1 有它的值,而在单击按钮后它没有......当时我真的不明白的是,我只是调试了它,并注意到anno1 已定义初始化(如果我单击按钮或未单击按钮),但单击按钮时, anno1 再次未定义,而其他方法仍定义。

Edit2:问题已解决。不知何故,我在函数showAnno() 中遇到了this 的问题(这是错误的)。现在我需要打电话给.bind(this),现在它可以工作了。

【问题讨论】:

  • 将此添加到您的按钮:ng-disabled="!controllerName.anno1"。这将禁用按钮,直到 anno1 被初始化。 (我使用了controllerName,因为我不知道您是如何在视图上定义控制器的,但是根据您对this. 的使用,您似乎正在使用controllerAs 语法)
  • @Lex 但是等待一分钟直到单击或禁用它之间有区别吗?因为我等了多久,它似乎没有加载..
  • $onInit() 甚至被调用了吗?那个功能不是只在组件控制器中使用吗?你把它写成组件了吗?
  • @Lex 它是一个指令控制器,是的。是的,我仔细检查了该函数是否被调用...
  • 明确一点,使用ng-disabled 方法没有工作。那是对的吗?你能用你尝试过的方法更新你的问题并描述结果吗?

标签: javascript angularjs


【解决方案1】:
if(this.anno1 != null){
this.anno1.show();
}

但是如果它为空,你希望它做什么?等等?

【讨论】:

  • 我也有同样的想法,但我想知道的是,每当我点击按钮(触发showAnno()-function,它仍然没有定义......
  • 如果是我,我会停用该按钮,直到它被定义为止。完成定义后,激活按钮。
  • 这不会那么容易,因为有 4 个文件,这与彼此有关...是否有 angular 中的函数,我可以确定,没有别的被执行,直到对象被定义。
  • 函数 checkAnnoDefined(an){ if(an==null) { setTimeout(function(){ checkAnnoDefined(); }, 500);返回假; } else { //此时定义 } }
  • 你也许可以使用类似的东西。我不确定您到底要做什么,但这可能会奏效。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多