&和之间有什么区别&?
就像下面的代码一样,两者的工作方式是否相同?
<a href="mailto:EMAIL?subject=BLABLABLA&body=http://URL, SHORT DESCRIPTION"></a>
<a href="mailto:EMAIL?subject=BLABLABLA&body=http://URL, SHORT DESCRIPTION"></a>
Run Code Online (Sandbox Code Playgroud) 我有一个暴露IObservable状态的API .但是这种状态取决于必须通过初始化的潜在可观察源Init.
我想做的是保护用户不必按正确的顺序执行操作:就像目前的情况一样,如果他们Status在执行之前尝试订阅,则会Init因为源未初始化而获得异常.
所以我有一个天才的想法,用一个Subject来解耦这两个:订阅我的外部用户Status只是订阅主题,然后当他们调用时Init,我使用我的主题订阅底层服务.
private ISubject<bool> _StatusSubject = new Subject<bool>();
public IObservable<bool> Status { get { return _StatusSubject; } }
public void Init()
{
_Connection = new Connection();
Underlying.GetDeferredObservable(_Connection).Subscribe(_StatusSubject);
}
Run Code Online (Sandbox Code Playgroud)
但是,通过对虚拟项目的测试,问题是初始化通过订阅主题来"唤醒"我的基础Observable,即使没有人订阅该主题.如果可能的话,这是我想避免的,但我不确定如何......
(我也注意到所接受的智慧,"一般规则是,如果你正在使用一个主题,那么你做错了什么")
在观察者设计模式中,观察者观察主体和/或可观察者.观察者通过他们的更新得到通知.
我很困惑这两件事(主题和可观察的)是否基本相同?或者这两者之间有细微差别吗?
我有组件 A、组件 B 和一项服务。我在服务中声明了 Subject 并订阅了组件 B. 中的主题,并且在导航到组件 B 之前,我将一些数据从组件 A 发送到主题。它正在导航到组件 B,但没有触发订阅方法。
服务:
@Injectable({
providedIn: 'root'
})
export class ServiceTestService {
storage: Recipe;
recipeSelected = new Subject<any>();
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
组件 A向 observable 发送消息
@Component({
selector: 'app-recipe-item',
templateUrl: './recipe-item.component.html'
})
export class RecipeItemComponent implements OnInit {
@Input() recipe: Recipe;
constructor(
private recipeService: ServiceTestService,
private rt: Router) { }
ngOnInit() {
}
onRecipeSelected(name: number) {
this.recipeService.recipeSelected.next(this.recipe);
this.rt.navigate(['/recipe', this.ind]);
}
}
Run Code Online (Sandbox Code Playgroud)
组件 B: 这里我订阅了 Observable。
@Component({
selector: 'app-recipe-detail',
templateUrl: …Run Code Online (Sandbox Code Playgroud) 我期待着为绿色或红色的一些异步接收数据着色,具体取决于它的值.
为了处理竞争条件,我使用了一个Subject,它广播一个包含我感兴趣的数据的Object.
我成功地做了我想做的事,但结果代码非常难看:
<span [ngClass]="{greenClass: isPositive((mySubject | async)?.fieldData), redClass: !isPositive((mySubject | async)?.fieldData)}">
{{(mySubject | async)?.fieldData | number:'1.0-1' }}
</span>
有没有更好的方法来解决这个问题?我试图在ngClass中放置一个三元表达式,但它没有用.将代码移回我的控制器是不行的,因为它会立即创建十个变量.
我想标准化电子邮件主题的结构(对于所有 Woocommerce 电子邮件通知)。\n我正在使用这里所有可用的过滤器
\n\n但是 \xe2\x80\x9cOnhold\xe2\x80\x9d、\xe2\x80\x9cCancelled\xe2\x80\x9d、\xe2\x80\x9cRefunded\xe2\x80\x9d 和 \xe2\x80\x9cFailed 订单又如何呢\xe2\x80\x9d 电子邮件主题?
\n有没有办法更改这些电子邮件的电子邮件主题?
我已经检查了这个https://github.com/angular/angular/issues/12129 但我没有看到任何解决方案......
Angular 2.0.1 AsyncPipe 不适用于 Rx Subject。
这里的解决方法是在组件中创建一个可观察的变量
我有但仍然没有工作......不知道为什么它不起作用,如果我将我的主题切换UserStateService到 BehaviorSubject 一切正常......
注意:UserDataService 和 UsersStateService 都在根 app.module.ts 中提供。
user-data.service.ts -> 发出我在组件中调用的 http 请求
fetchUsers():void{
this.httpClient.get<User[]>(this.apiUrl, {
observe: 'body',
responseType: 'json'
})
.subscribe( (response: User[])=>{
this.usersStateService.setUsersList(response); <-- set to local state service
});
}
Run Code Online (Sandbox Code Playgroud)
用户状态.service.ts
userListState = new Subject<User[]>(); <-- Change this to BehaviorSubject<User[]>([]) everything works!
setUsersList(users: User[]):void {
this.userListState.next(users.slice());
}
getUsersListState():Observable<User[]>{
return this.userListState.asObservable();
}
Run Code Online (Sandbox Code Playgroud)
组件.ts
users: Observable<User[]>;
ngOnInit() {
if(this.usersStateService.hasUserList()){
this.users = this.usersStateService.getUsersListState(); -|
|
// …Run Code Online (Sandbox Code Playgroud) 我有两个组件,sourceComponent和targetComponent。我想要对sourceComponent中的按钮单击事件在targetComponent中执行一个功能。我决定为此使用Subject。
sourceComponent.ts
export class SourceComponent{
constructor(private btnclk: ButtonClickService){}
onButtonClick(){
this.btnclk.updateButtonClick(event);
}
}
Run Code Online (Sandbox Code Playgroud)
targetComponent.ts
export class TargetComponent{
constructor(private btnclk: ButtonClickService){
this.btnclk.getButtonClick().subscribe(event=>{
console.log('Click from source component to target component') // not working
});
}
}
Run Code Online (Sandbox Code Playgroud)
ButtonClickService.ts
@Injectable()
export class ButtonCLickService{
private btnclk = new Subject<Event>();
getButtonClick() : Observable<Event>{
return this.btnclk.asObservable();
}
updateButtonClick(event : Event){
this.btnclk.next(event);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在appComponent.ts中订阅相同的click事件时,它工作正常。
appComponenet.ts
export class AppComponent{
constructor(private btnclk: ButtonClickService){
this.btnclk.getButtonClick().subscribe(event=>{
console.log('Click from source component to app component') //working
});
}
}
Run Code Online (Sandbox Code Playgroud)
请解释为什么它在父组件和子组件之间起作用,而在两个不相关的组件之间不起作用。还请帮助我如何在两个不相关的组件之间进行这项工作。提前致谢
我正在尝试使用带有主题和消息的GMAIL发送电子邮件.我已成功使用GMAIL发送电子邮件而未执行,subject也已收到电子邮件.但是,每当我尝试添加主题时,该程序根本不起作用.
import smtplib
fromx = 'email@gmail.com'
to = 'email1@gmail.com'
subject = 'subject' #Line that causes trouble
msg = 'example'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.ehlo()
server.login('email@gmail.com', 'password')
server.sendmail(fromx, to, subject , msg) #'subject'Causes trouble
server.quit()
Run Code Online (Sandbox Code Playgroud)
错误行:
server.sendmail(fromx, to, subject , msg) #'subject'Causes trouble
Run Code Online (Sandbox Code Playgroud) 我创建了一个服务,以便从API获取数据并使用Subject从我的组件中获取这些数据(在应用程序初始化时调用LoadTenants):
服务 :
@Injectable()
export class TenantService{
public tenants;
private tenantSubject = new Subject<any>();
constructor(private http: HttpClient) {
}
LoadTenants() {
this.http.get(TENANT_URL).subscribe((data: any) => {
this.tenants = data;
this.setTenants();
});
}
setTenants() {
this.tenantSubject.next(this.tenants);
}
getTenants(): Observable<any> {
return this.tenantSubject.asObservable();
}
getSyncTenants() {
return this.tenants;
}
}
Run Code Online (Sandbox Code Playgroud)
组成部分:
public tenant;
subsciption: Subscription;
constructor(private tenantService: TenantService) { }
ngOnInit() {
this.subsciption = this.tenantService.getTenants().subscribe((datas) => {
this.tenant = datas;
},
error => console.log('Error : ', error)
);
}
}
ngOnDestroy() {
this.subsciption.unsubscribe(); …Run Code Online (Sandbox Code Playgroud) 我正在构建一个过滤器,您可以在其中按类别过滤,您可以通过单击类别名称旁边的复选框来选择一个类别。
所以我有一个filterComponent,它包含它自己的过滤器,然后是一个filterService,它有一个类别属性Subject<Array<ICategory>>,这个属性用于将数据传递到productsComponent我订阅类别属性的位置。
当我想使用此模式传递一个简单的字符串时,此逻辑有效,但当我想传递对象数组时,它似乎不起作用。
在我的 filters.component.html 文件中,当复选框值发生变化时,我正在调用一个方法:
<li *ngFor="let category of categories">
<mat-checkbox (change)="addOrRemoveCategory(category)" [(ngModel)]="category.isChecked">
{{'category.' + category.Name | translate}}
</mat-checkbox>
</li>
Run Code Online (Sandbox Code Playgroud)
addOrRemoveCategory 方法实现如下所示:
private addOrRemoveCategory(category: ICategory): void {
if (!this.chosenCategories.includes(category)) {
this.add(category);
} else {
this.remove(category);
}
this.filterService.categories.next(this.chosenCategories);
}
Run Code Online (Sandbox Code Playgroud)
所以无论一个类别发生了什么,被添加或删除,(我在内部修改了selectedCategories数组,我用它的值调用 .next() ),我用更新的数组调用 .next() 。
问题是,当selectedCategories数组为空时,我推送到它,并用它调用 .next() 时,我正确地获取了订阅者函数中的值,但是如果再次执行此操作,并且我有一个2 个元素数组,我调用 .next(this.chosenCategories),我的订阅者方法没有收到通知。
但是,一旦我使用空数组调用 .next() ,我的订阅者方法就会再次收到通知(因为我已经删除了之前选择的所有类别)。
订阅者方法:
this.categoriesChangeSubscription = this.filterService.categories
.pipe(
debounceTime(500),
distinctUntilChanged()
)
.subscribe((categories: Array<ICategory>) => { …Run Code Online (Sandbox Code Playgroud) subject ×11
angular ×6
rxjs ×3
angular-pipe ×1
c# ×1
class ×1
email ×1
gmail ×1
href ×1
html ×1
java ×1
mailto ×1
observable ×1
observers ×1
php ×1
python ×1
python-2.7 ×1
share ×1
woocommerce ×1
wordpress ×1