【问题标题】:JSDoc resolve unresolved variableJSDoc 解析未解析的变量
【发布时间】:2013-09-10 11:34:44
【问题描述】:

我使用 Dojo,并且一些页面小部件是在代码之外的 HTML 模板中定义的。我怎么能对 JSDoc 说一些 this 字段真的被定义了?

SomePage.js

define([ "dojo/dom", "dojo/on", "dojo/_base/lang" ],
   function(dom, on, lang) {

      return {        
            init: function(){    
                on(this._myButton, "click", lang.hitch(this, this._foo));
            },

            foo: function(){
                //some code here
            }
      }            
   }
});

SomePage.html

<div>
    <div class="Button" data-dojo-attach-point="_myButton">
        Click me!
    </div>
</div>

在此示例中,JSDoc 警告我 this._myButton 未解决。它在可见范围内实际上是未定义的,但实际上它保证由 Dojo 通过data-dojo-attach-point 定义。我如何覆盖 JSDoc 并告诉他 this._myButton 是为当前模块定义的? (使用Webstorm IDE)

【问题讨论】:

    标签: javascript dojo webstorm jsdoc


    【解决方案1】:

    我遇到了同样的问题,目前它不是自动“解决”的,而是通过风格/纪律。我面前没有代码,但在工作中我们正在制作类似这样的小部件:

    define([
            "dojo/declare", 
            "dojo/dom",
            "dojo/on",
            "dojo/_base/lang",
            "dijit/_WidgetBase",
            "dijit/_TemplatedMixin",
            "dijit/_WidgetsInTemplateMixin",
            "dojo/text!./templates/myTemplate.html"
            "dijit/form/Button" // Instantiated in template
    ], function(declare, dom, on, lang, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template) {         
            return declare([_WidgetBase, _TemplatedMixin, WidgetsInTemplateMixin],{        
                templateString:template,    
    
    
                // Attachpoints
                _myButtonWidget:null,
                _someThingyNode:null,
    
                init: function(){    
                    on(this._myButtonWidget, "click", lang.hitch(this, this._foo));
                },
                foo: function(){
                    //some code here
                }
            });            
    });
    

    myTemplate.html 喜欢:

    <div>
        <div data-dojo-type="dijit/form/Button" data-dojo-attach-point="_myButton">
            Click me!
        </div>
        <div data-dojo-attach-point="someThingyNode"><!-- Not a widget--></div>
    </div>
    

    主要的收获应该是您在创建属性时无需等待 Dojo 在运行时创建它。作为个人惯例,附加的 dijit 以“Widget”结尾,任何“vanilla”附加点都被命名为“Node”。

    好处:

    1. 它让您的 IDE 很开心,因此它不会弹出不必要的警告
    2. 它使您的 IDE 能够提供代码完成
    3. 它会通知正在读取.js 文件的任何人存在附加点
    4. 尤其是有很多附加点时,您不必一直引用 .html 模板来确定您是在处理子小部件还是普通 DOM 节点。

    【讨论】:

    • 这适用于 pageViews。我还可以补充一点,如果您使用declare 创建自己的小部件,您可以在构造函数中隐式定义this._myButtonWidget
    • “对于 PageViews”?我认为如果它不在 constructor() 方法中会更简洁一些,因为它使它看起来稍微更像是一个占位符(它是)而不是稍后分配的值。也许这只是 PHP/Java 的溢出风格偏好。
    • 如果你使用declare函数,在构造函数或外部定义的东西是有区别的。外部定义的每个引用都在所有对象实例之间共享(如 Java 中的“静态”)。这就是为什么我更喜欢在可能的情况下保留定义
    • 我通过只将“外部”定义设置为null 来避免这种情况,但我想不熟悉代码的人可能会意外输入[] 之类的东西。
    猜你喜欢
    • 2018-11-02
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多