无法在键值存储中设置未定义的属性

Posted

技术标签:

【中文标题】无法在键值存储中设置未定义的属性【英文标题】:Cannot set properties of undefined in key-value store 【发布时间】:2022-01-01 10:24:39 【问题描述】:

我有这个代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./framework.js"></script>
</head>
<body>
  <p f-text="name"></p>
  <script>
    Framework.store('name', 'Joe');
  </script>
</body>
</html>
document.querySelectorAll('*').forEach((element) => 
  if (element.hasAttribute('f-text')) 
    const textValue = element.getAttribute('f-text');
    
    element.innerHTML = window.fStore[textValue];
  
);

window.Framework = 
  store: (key, value = '') => 
    if (value === '') 
      return window.fStore[key];
    

    window.fStore[key] = value;
  

但是得到这个错误:

TypeError: Cannot set properties of undefined (setting 'name')
    at Object.store (/framework.js:15:24)
    at /:12:15

我希望页面通过从f-text 获取密钥,在window.fStore 中找到密钥的值,然后将element.innerHTML 设置为值来呈现“Joe”。 Framework.store() 接受一个键和一个值,如果没有值,则从 window.fStore 中的键返回值,如果有则将 window.fStore[key] 设置为值。

【问题讨论】:

【参考方案1】:

你需要先检查window.fStore是否存在。

window.Framework = 
  store: (key, value = '') => 
    if(!window.fStore) window.fStore = 
    if (value === '') 
      return window.fStore[key];
    
    window.fStore[key] = value;
  

Framework.store('name', 'Joe');

document.querySelectorAll('*').forEach((element) => 
  if (element.hasAttribute('f-text')) 
    const textValue = element.getAttribute('f-text');
    element.innerHTML = window.fStore[textValue];
  
);
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <p f-text="name"></p>
</body>

</html>

【讨论】:

我试过了,它不再给我错误,但页面保持空白。 @TacoSnack 将带有 JS 文件的脚本标签移动到 p 标签之后。这可能是因为当您尝试选择元素时,该元素不在 DOM 中。 那也没用。 @TacoSnack 也可以在选择元素之前调用store。基本上就是把sn-p里面的JS复制到文件里就行了。【参考方案2】:

您可能还需要等到窗口首先加载。如果你不这样做,有些浏览器会让你头疼

window.addEventListener('load', e=>
  window.Framework = 
    store: (key, value = '') => 
      if(!window.fStore)
        window.fStore = ;
      if (value === '')
        return window.fStore[key];
      window.fStore[key] = value;
    
  
  window.Framework.store('name', 'Joe');

  document.querySelectorAll('*').forEach((element) => 
    if (element.hasAttribute('f-text'))
      element.innerHTML = window.fStore[element.getAttribute('f-text')];
  );
 

【讨论】:

当我这样做时,我得到这个错误:ReferenceError: Framework is not defined at /:12:5 抱歉希望编辑修复它 我在&lt;script&gt;标签中有Framework.store(),而不是在JS文件中。

以上是关于无法在键值存储中设置未定义的属性的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ejs 中设置未定义的属性“回合”

无法在 Vue.js 中设置未定义的属性“产品”[重复]

错误 _renderer.setElementStyle “无法在 [null] 中设置未定义的属性‘背景颜色’”

Redux 和 React-Native:无法读取未定义的属性“类型”

在键值数据存储中存储目录层次结构

TypeError:无法读取未定义 Firebase 存储反应的属性“参考”