【问题标题】:Store is null or not an object error in dojo存储为空或不是 dojo 中的对象错误
【发布时间】:2025-12-20 18:20:17
【问题描述】:

我为菜单项“删除”定义了一个功能,右键单击树层次结构的任何文件夹,以删除树的文件夹。但是点击它时,我收到以下错误消息“Store is null or not an object error in dojo”

谁能建议我如何纠正这个错误信息?我下面的函数有问题吗?

<ul dojoType="dijit.Menu" id="tree_menu" style="display: none;">   
      <li dojoType="dijit.MenuItem" data-dojo-props="disabled: false,
                                     onClick: function (evt){
                                     store.deleteById(selectedItemId);
                                     resetEditor();
                                 }",>Delete project</li></ul>

树形结构

- Main Project 1 
Sub Project 1_1  
Sub Project 1_2
 * sub Project 1_3 

+ Main Project 2 - 
Main Project 3 

Sub Project 3_1 - 
Sub Project 3_2 
Sub Project 3_2_1

【问题讨论】:

  • 好吧,您在该 onClick 函数中引用了一个 store 变量,但我猜它实际上在该函数可见的范围内不可用...您实际上在哪里定义你的店? (为此,resetEditor 定义在哪里,因为这可能是它会抱怨的下一件事。)
  • 嗨,Ken,我在 mycode 的开头定义了商店。相同的代码适用于按钮,但当我将其转换为菜单项时失败。可能是什么原因?我们可以实现菜单项的代码与我上面所做的相同吗?奇怪的是它响应按钮但菜单项失败。这是按钮代码:

标签: javascript dojo


【解决方案1】:

onClick 函数似乎在 MenuItem 上下文中运行,这意味着在您的 onclick 函数中,“this”指的是 MenuItem 小部件实例。

要在 onClick 方法中使用您的 store 变量,您可以首先在您的小部件中引用它,如下所示:

<ul dojoType="dijit.Menu" id="tree_menu" style="display: none;">   
  <li dojoType="dijit.MenuItem" data-dojo-props="disabled: false,
                                 _store: store,
                                 onClick: function (evt){
                                 _store.deleteById(selectedItemId);
                                 resetEditor();
                             }",>Delete project</li></ul>

或者您可以在窗口上下文中引用您的全局存储对象:

<ul dojoType="dijit.Menu" id="tree_menu" style="display: none;">   
  <li dojoType="dijit.MenuItem" data-dojo-props="disabled: false,
                                 onClick: function (evt){
                                 window.store.deleteById(selectedItemId);
                                 resetEditor();
                             }",>Delete project</li></ul>

【讨论】:

  • 嗨 Sebastien,我尝试了您对删除菜单项的代码中的建议更改,但它不起作用。我尝试了您上面提到的两种建议方式,但对删除菜单项没有响应。我在“非工作代码”标题下的第一个线程中添加了我的整个代码。如果我在我的代码中犯了任何错误,你能看看吗?奇怪的是,如果我们放置一个按钮而不是 menuitem,它就可以工作。
  • 您好,您的代码似乎有一点错误:在 MenuItem 的 onClick 方法中,您调用的是 _store.deleteById(selectedItemId);而不是 this._store.deleteById(selectedItemId);
  • 嗨塞巴斯蒂安,当我使用 this._Store.deleteById(selectedItemId);我在 firebug 和 IE dev 调试工具中得到了这个错误消息。 “'this._store' 为空或不是对象”。我的代码在标题“非工作代码”下的第一个线程中。如果我的代码中缺少其他内容,请您看一下。这是我遇到的最奇怪的问题之一,因为按钮单击调用了该函数,但没有从菜单中调用相同的函数。我的代码可以复制到 .txt 并保存为 .html。打开 html 并允许 activex 然后它将运行。右键单击文件夹以查找删除菜单项不起作用。
  • 您好,您似乎没有得到我昨天的解释:在您的 HTML 页面中,替换 '_store.deleteById(selectedItemId);'使用“this._store.deleteById(selectedItemId);”。 _store 是您的 MenuItem 的一个属性,一旦您使用 _store: store 设置它,因此您需要在您的方法中使用 this._store 来引用它。
  • 一个查询 Sebastien,虽然代码有效,但它只在最后一个文件夹下创建文件夹。我在树结构标题下的 myfirst 线程中添加了树形图片结构以获取外观。我的意思是,如果我右键单击 Sub Project 3_2_1 并单击添加文件夹,它会在其下添加文件夹,但如果我对其他文件夹(如 Sub Project 3_2/Sub Project 3_1)执行相同操作,则它不适用于单击的文件夹,但它会创建文件夹再次在子项目 3_2_1_1 下。那么你能说为什么会出现这种奇怪的行为,我该如何纠正它?我们在代码中做的事情是不是不正确?