由於您最初只需要app.html
中的模板而不實例化app.js
中的類,Aurelia將它視爲自定義元素,這意味着它具有自己的實例(不是單例)。您基本上正在處理兩個不同的FlashMessage
實例,因此其中一個的屬性不會反映在另一個實例中。
如果您希望將它作爲單例類實例化,則還需要導入app.js
中的組件,並將其注入到構造函數中,以便將它視爲組件而不是自定義元素。
app.js定義元素和類之間
import {FlashMessage} from './resources/elements/flash-message';
@inject(FlashMessage)
export class App {
constructor(flashMessage) {
this.flashMessage = flashMessage;
}
// ...
}
混亂/視圖模型
由於所有的類屬性被認爲是公開的,你甚至都不需要setMessage(newValue)
方法。您可以從object-detail.js
更新消息屬性是這樣的:
this.flash.message = 'Activate';
此外,@bindable
行的目的是使用,讓您可以在HTML代碼中的變量值初始化它,就像這樣:
<flash-message message="Show this message"></flash-message>
如果你不打算像這樣使用它,我會跳過整個@bindable
行。你flash-message.js
可以簡化爲僅僅這一點:對Flash的消息
export class FlashMessage {
constructor() {
this.message = 'Default';
}
}
使用事件聚合的
我實現了有類似目標的一個Flash Message類,使用Toastr第三方庫(只是因爲我喜歡UI)。但是,以任何你想要的方式設置它並不難。我相信,允許應用程序的任何部分設置Flash消息的最佳方法是使用Aurelia的事件聚合器。以下代碼片段可能會幫助您完成設置。
閃存message.js
import { inject } from 'aurelia-framework'
import { EventAggregator } from 'aurelia-event-aggregator';
@inject(EventAggregator)
export class FlashMessage {
constructor(eventAggregator) {
this.eventAggregator = eventAggregator;
this.eventAggregator.subscribe('ShowFlashMessage', this.showMessage);
}
showMessage(message) {
this.message = message;
// hide after 10 seconds
window.setTimeout(hideMessage, 10000);
}
hideMessage() {
this.message = "";
}
}
這顯然簡化,併發布了第二條消息時,不會處理多條消息,或更新計時器,但它應該足以讓你開始。
要設置從您的應用程序的其他部分的消息,你可以簡單地先注入eventAggregator並保存在你的構造函數,然後發佈這樣的消息:
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
在奧裏利亞我Toastr實現:
給你做了什麼一樣,我在src
文件夾中創建名爲在一個名爲common
子FlashMessage
一個共同的類。
//src/common/flash-message.js
import * as toastr from 'toastr';
import { inject } from 'aurelia-framework'
import { EventAggregator } from 'aurelia-event-aggregator';
@inject(EventAggregator)
export class FlashMessage {
constructor(eventAggregator) {
this.eventAggregator = eventAggregator;
this.eventAggregator.subscribe('ewFlashSuccess', this.showSuccess);
this.eventAggregator.subscribe('ewFlashInfo', this.showInfo);
this.eventAggregator.subscribe('ewFlashWarning', this.showWarning);
this.eventAggregator.subscribe('ewFlashError', this.showError);
// Not sure why this is not working... if you figure it out, let me know.
toastr.options = {
positionClass: "toast-top-left",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut",
preventDuplicates: true,
closeButton: true
}
}
showSuccess(message) {
toastr.success(message, null, {preventDuplicates: true, closeButton: true});
}
showInfo(message) {
toastr.info(message, null, {preventDuplicates: true, closeButton: true});
}
showWarning(message) {
toastr.warning(message, null, {preventDuplicates: true, closeButton: true});
}
showError(message) {
toastr.error(message, null, {preventDuplicates: true, closeButton: true});
}
}
然後,我注入和app.js
這樣的實例是:
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
constructor(core, flashMessage) {
this.flashMessage = flashMessage;
}
// ...
}
我也不得不要求CSS在app.html
這樣的:
<require from="toastr/build/toastr.min.css"></require>
所有這一切都取決於正確安裝了Toastr
(我使用npm install toastr --save
進行了安裝),並正確要求aurelia.json
(我正在使用CLI)。
{
"name": "toastr",
"path": "../node_modules/toastr",
"main": "toastr",
"resources": [
"build/toastr.min.css"
]
},
最後的想法
另請參閱阿什利格蘭特的用於獲取關於您的視圖模型一個手柄以及工作GistRun來立即解決問題的一個更好的解釋迴應。阿什利比我在奧裏利亞更有經驗,所以如果我的解決方案的某些部分不起作用,他很可能會! :-)
由於自定義元素是用多個實例實例化的,因此您正在處理兩個「FlashMessage」實例,因此其中一個實例的屬性不會反映到另一個實例中。 – LStarky