【发布时间】:2019-03-15 05:16:46
【问题描述】:
我有一个 Aurelia 消息应用程序,我需要在收到新消息时动态更改网站图标。
您可能已经观察到,如今许多应用都在做一些事情来让用户了解状态变化。
当用户在其他选项卡上时特别有用。
查看 here 和 here 的类似问题,在 vanilla JS 或 JQuery 中的工作似乎非常简单。
我目前对这个问题的看法是在我的视图模型中添加一个可以直接访问 DOM 的函数。
activate() {
PLATFORM.addEventListener('newMessageIsReceived', this.msgReceived, true);
PLATFORM.addEventListener('msgIsRead', this.msgRead, true);
}
deactivate() {
PLATFORM.removeEventListener('newMessageIsReceived', this.msgReceived);
PLATFORM.removeEventListener('msgIsRead', this.msgRead);
}
msgReceived(event) {
// new msg received. Change the favicon to alert mode
let link = PLATFORM.querySelector("link[rel*='icon']") || PLATFORM.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = 'alert.ico';
PLATFORM.getElementsByTagName('head')[0].appendChild(link);
}
msgRead(event) {
// msg read by the user, change the favicon back to default
let link = PLATFORM.querySelector("link[rel*='icon']") || PLATFORM.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = 'default.ico';
PLATFORM.getElementsByTagName('head')[0].appendChild(link);
}
但这里最明显的问题是从我的视图模型内部直接操作 DOM 的非常类似于 JQuery 的方法。
考虑到这只是一个特例,我可以接受它,但想知道是否有更好的 Aurelia 方法来实现这一点。
类似
<link rel="shortcut icon" type="image/ico" href.bind="faviconLink">
但是如何在索引页的头部使用绑定呢? Aurelia 确实会更新每个路线导航上的页面标题,并且由于标题也在 aurelia-app 根目录之外,因此应该可以从 Aurelia 应用程序内部绑定/操作其他头部属性。对吧?
还有另一个有趣的approach to use canvas,我们可以拥有动态的网站图标。
const canvas = document.createElement('canvas')
canvas.height = 64
canvas.width = 64
const ctx = canvas.getContext('2d')
ctx.font = '64px serif'
ctx.fillText('????', 0, 64)
console.log(canvas.toDataURL())
const favicon = document.querySelector('link[rel=icon]')
favicon.href = canvas.toDataURL()
但话说回来,如何避免直接的 DOM 操作并使用 Aurelia 的绑定,即使是这种方法?
【问题讨论】:
标签: javascript html aurelia