Ember.js辛烷和JavaScript(非TS)

我有一个访问会话存储的服务.当我添加或删除特定的键时,我希望我的顶级组件切换导航栏的可见性.我try 了各种不同的跟踪,等等.我试图让一个观察者工作,但坦率地说,我不理解它,我不确定这是否是我需要的.

当存储更新时,然后我手动按F5,应用程序shell 就会看到更改.

当我拨打setAuthenticationToken(value)时,我想让applcaiton-shell注意到这一变化.

我如何才能让应用程序shell 程序自己看到更改?


应用程序-shell .hbs&.js

{{#if this.isAuthenticated}}
<nav class="mt-8">...</nav>
{{/if}

import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking'
import { inject as service } from '@ember/service';

export default class ApplicationShellComponent extends Component {
    @service SessionManager
    @tracked isAuthenticated = this.SessionManager.isAuthenticated
}

Service.js

const SessionId_Key = 'SIDK'
export default class SessionManagerService extends Service {

    @tracked isAuthenticated = this.getAuthenticationToken()
    
    delAuthenticationToken()     {        this.delItem(SessionId_Key)        }
    getAuthenticationToken()     { return this.getItem(SessionId_Key)        }
    setAuthenticationToken(value){        this.setItem(SessionId_Key, value) }

    delItem(key)        {        sessionStorage.clear  (key)        }
    getItem(key)        { return sessionStorage.getItem(key)        }
    setItem(key, value) {        sessionStorage.setItem(key, value) }
}

已更新答案: 只需在del/set身份验证方法中设置isAuthated就是我所需要的.

delAuthenticationToken() {        
  this.delItem(SessionId_Key);
  this.isAuthenticated = false;      
}

setAuthenticationToken(value) {
    this.setItem(SessionId_Key, value);
    this.isAuthenticated = true;
}

推荐答案

isAuthenticated只设置一次

    @tracked isAuthenticated = this.SessionManager.isAuthenticated

这意味着,变量isAuthenticated是用来自会话管理器的值来初始化的(不是那个值,isAuthated总是在=的右侧表示值(因为赋值只发生一次)).

要使其具有react 性,您需要将其转换为Gatter.

get isAuthenticated() {
  return this.SessionManager.isAuthenticated;
}

otherwise,如果你想保持@tracked isAuthenticated,你的一个函数需要设置这个值.

在这两种情况下,您的模板

{{#if this.isAuthenticated}}
  <nav class="mt-8">...</nav>
{{/if}

然后会按预期进行更新


您的整体代码将如下所示:

应用程序shell HBS

{{#if this.isAuthenticated}}
  <nav class="mt-8">...</nav>
{{/if}

应用程序shell 程序js


import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking'
import { inject as service } from '@ember/service';

export default class ApplicationShellComponent extends Component {
    @service SessionManager

    get isAuthenticated() {
        return this.SessionManager.isAuthenticated;
    }
}

服务:

const SessionId_Key = 'SIDK'
export default class SessionManagerService extends Service {

    @tracked isAuthenticated = this.getAuthenticationToken()
    
    delAuthenticationToken() {        
      this.delItem(SessionId_Key);
      this.isAuthenticated = false;      
    }
    
    getAuthenticationToken() { 
        return this.getItem(SessionId_Key);
    }

    setAuthenticationToken(value) {
        this.setItem(SessionId_Key, value);
        this.isAuthenticated = true;
    }

    delItem(key)        {
        sessionStorage.clear(key);        
    }

    getItem(key)        { 
        return sessionStorage.getItem(key);        
    }
    setItem(key, value) {        
        sessionStorage.setItem(key, value);
    }
}

Javascript相关问答推荐

为什么JavaScript双边字符串文字插值不是二次的?

React存档iframe点击行为

对象和数字减法会抵消浏览器js中的数字

Vue:ref不会创建react 性属性

Cookie中未保存会话数据

React 17与React 18中的不同setState行为

更改JSON中使用AJAX返回的图像的路径

Regex结果包含额外的match/group,只带一个返回

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

使用原型判断对象是否为类的实例

Reaction Native中的范围滑块

在运行时使用Next JS App Router在服务器组件中运行自定义函数

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

如何在JAVASCRIPT中临时删除eventListener?

面对代码中的错误作为前端与后端的集成

AddEventListner,按键事件不工作

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

如果我的列有条件,我如何呈现图标?

如何设置时间选取器的起始值,仅当它获得焦点时?

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的