如何在Aurelia中设置Flash消息?

如何在Aurelia中设置Flash消息?,aurelia,Aurelia,我想知道如何在奥雷利亚制作flash消息。我已经创建了一个自定义元素flash消息,并在app.html中需要它,但消息没有更新。如果我将其设置为默认值,它确实会正确显示 app.html object-detail.js 正在调用激活代码和setMessage方法,但显示的messaged没有更新。我缺少什么?由于最初只需要app.html中的模板,而没有在app.js中实例化类,因此Aurelia将其视为自定义元素,这意味着它有自己的实例,而不是单一实例。您基本上使用的是两个不同的Flash

我想知道如何在奥雷利亚制作flash消息。我已经创建了一个自定义元素flash消息,并在app.html中需要它,但消息没有更新。如果我将其设置为默认值,它确实会正确显示

app.html

object-detail.js


正在调用激活代码和setMessage方法,但显示的messaged没有更新。我缺少什么?

由于最初只需要app.html中的模板,而没有在app.js中实例化类,因此Aurelia将其视为自定义元素,这意味着它有自己的实例,而不是单一实例。您基本上使用的是两个不同的FlashMessage实例,因此其中一个实例的属性不会反映在另一个实例中

如果希望将其实例化为单例类,还需要在app.js中导入该组件并将其注入构造函数,以便将其视为组件而不是自定义元素

app.js

自定义元素和类/视图模型之间的混淆

因为所有类属性都被认为是公共的,所以您甚至不需要setMessagenewValue方法。您可以从object-detail.js更新消息属性,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
此外,还打算使用@bindable行,以便您可以使用HTML代码中的变量值对其进行实例化,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
对Flash消息使用事件聚合器

我实现了一个具有类似目标的Flash消息类,使用Toastr第三方库只是因为我喜欢UI。但是,按照你想要的方式进行设置并不难。我认为,允许应用程序的任何部分设置flash消息的最佳方法是使用Aurelia的事件聚合器。下面的代码片段可能会帮助您进行设置

flash-message.js

这显然很简单,不需要处理多条消息,也不需要在发布第二条消息时更新计时器,但这应该足以让您开始

要设置来自应用程序另一部分的消息,只需先插入eventAggregator并保存在构造函数中,然后发布如下消息:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
我的Toastr在Aurelia中的实现:

与您所做的类似,我在src文件夹中名为common的子文件夹中创建了一个名为FlashMessage的公共类

然后,我在app.js中注入并实例化了它,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
我还需要app.html中的CSS,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
最后的想法


请参阅Ashley Grant的回复,以更好地解释如何处理ViewModel以及如何使用GistRun来解决眼前的问题。Ashley在Aurelia方面比我更有经验,所以如果我的部分解决方案不起作用,他很可能会起作用!:-

由于最初只需要app.html中的模板,而没有在app.js中实例化类,因此Aurelia将其视为自定义元素,这意味着它有自己的实例,而不是单一实例。您基本上使用的是两个不同的FlashMessage实例,因此其中一个实例的属性不会反映在另一个实例中

如果希望将其实例化为单例类,还需要在app.js中导入该组件并将其注入构造函数,以便将其视为组件而不是自定义元素

app.js

自定义元素和类/视图模型之间的混淆

因为所有类属性都被认为是公共的,所以您甚至不需要setMessagenewValue方法。您可以从object-detail.js更新消息属性,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
此外,还打算使用@bindable行,以便您可以使用HTML代码中的变量值对其进行实例化,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
对Flash消息使用事件聚合器

我实现了一个具有类似目标的Flash消息类,使用Toastr第三方库只是因为我喜欢UI。但是,按照你想要的方式进行设置并不难。我认为,允许应用程序的任何部分设置flash消息的最佳方法是使用Aurelia的事件聚合器。下面的代码片段可能会帮助您进行设置

flash-message.js

这显然很简单,不需要处理多条消息,也不需要在发布第二条消息时更新计时器,但这应该足以让您开始

要设置来自应用程序另一部分的消息,只需先插入eventAggregator并保存在构造函数中,然后发布如下消息:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
我的Toastr在Aurelia中的实现:

与您所做的类似,我在src文件夹中名为common的子文件夹中创建了一个名为FlashMessage的公共类

然后,我在app.js中注入并实例化了它,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
我还需要app.html中的CSS,如下所示:

this.flash.message = 'Activate';
<flash-message message="Show this message"></flash-message>
this.eventAggregator.publish('ShowFlashMessage', "Record saved");
import { inject } from 'aurelia-framework';
import { FlashMessage } from './common/flash-message';
@inject(Core, FlashMessage)
export class App {
  constructor(core, flashMessage) {
    this.flashMessage = flashMessage;
  }
  // ...
}
<require from="toastr/build/toastr.min.css"></require>
最后的想法

请参阅Ashley Grant的回复,以更好地解释如何处理ViewModel以及如何使用GistRun来解决眼前的问题。艾希礼是一个很有魅力的人
比我对Aurelia更有经验,所以如果我的部分解决方案不起作用,他很可能会-

我建议使用view model.ref=flash获取对自定义元素的ViewModel的引用。请注意,您将无法从激活回调中使用此选项,尽管在页面生命周期的该点上不会发生绑定。我在下面的示例中使用了附加的回调

下面是一个例子:

app.html

app.js

导出类应用程序{ 附件参数,routeConfig{ this.flash.setMessage'Activate'; } } flash-message.html

${message} flash-message.js

从“aurelia框架”导入{bindable,bindingMode}; 导出类FlashMessage{ @bindable{defaultBindingMode:bindingMode.twoWay}消息='Default'; setMessagenewValue{ this.message=newValue; } }
我建议使用view model.ref=flash获取对自定义元素的ViewModel的引用。请注意,您将无法从激活回调中使用此选项,尽管在页面生命周期的该点上不会发生绑定。我在下面的示例中使用了附加的回调

下面是一个例子:

app.html

app.js

导出类应用程序{ 附件参数,routeConfig{ this.flash.setMessage'Activate'; } } flash-message.html

${message} flash-message.js

从“aurelia框架”导入{bindable,bindingMode}; 导出类FlashMessage{ @bindable{defaultBindingMode:bindingMode.twoWay}消息='Default'; setMessagenewValue{ this.message=newValue; } }
从LStarky的信息中,我发现了我以前不知道的toastr,所以我最终只是使用了那个库

npm安装toastr-保存

bundle->dependencies下的aurelia.json

{
  "name": "toastr",
  "path": "../node_modules/toastr",
  "main": "toastr",
  "resources": [
    "build/toastr.min.css"
  ]
}
app.html


从LStarky的信息中,我发现了我以前不知道的toastr,所以我最终只是使用了那个库

npm安装toastr-保存

bundle->dependencies下的aurelia.json

{
  "name": "toastr",
  "path": "../node_modules/toastr",
  "main": "toastr",
  "resources": [
    "build/toastr.min.css"
  ]
}
app.html


由于自定义元素是用多个实例实例化的,因此您使用的是两个不同的FlashMessage实例,因此一个实例的属性不会反映在另一个实例中。由于自定义元素是用多个实例实例化的,因此您使用的是两个不同的FlashMessage实例,因此,一个的属性不会反映在另一个中。如果你想把我发布的答案添加到你的网站中,请随意。谢谢,你太好了!我很感激你给我这样的小家伙留下一些学习和成长的空间!如果你在我完整编辑的回复中看到任何不正确或误导的地方,请告诉我。如果你想把我发布的答案添加到你的网站上,请随意。谢谢,你太好了!我很感激你给我这样的小家伙留下一些学习和成长的空间!如果你在我完整编辑的回复中看到任何不正确或误导的地方,请告诉我。是的,这是我会推荐的,说实话:-干杯!很高兴你找到了解决办法!是的,老实说,这是我的建议:-干杯!很高兴你找到了解决办法!