也许我错过了什么。我找不到Observable及其语法的简单教程。我在使用Angular,我需要从服务调用一个函数(在组件中定义)。我读了这个解决方案。但是我不知道如何更改在服务中创建的Observable中的值(也许创建不是最好的方法)。
我在解决方案中有一个组件:
@Component({
selector: 'my-component',
...
)}
export class MyComponent {
constructor(myService:MyService) {
myService.condition.subscribe(value => doSomething(value));
}
doSomething(value) {
if (value) // do stuff
else // other stuff
}
}
这是我的服务:
import { Injectable } from '@angular/core';
import { Observable} from 'rxjs/Observable';
@Injectable()
export class MyService {
private condition: Observable<boolean>;
constructor() {
this.condition= new Observable(ob => {ob.next(false); })
// maybe ob.next is not the best solution to assign the value?
}
change() {// how can i change the value of condition to 'true', to call
// the doSomething function in the component??
}
}
管理登录状态
对于这个实现,您只需要一个Service。在其中,您将发出后端请求以查看用户是否有会话,然后您可以将其保存在Service的类变量中。然后,如果设置了该变量,则返回该变量,或者直接返回REST调用的结果。
例如:
export class AuthenticationService {
private loggedIn: boolean = null;
constructor(private http: Http) { }
getUserSession(credentials): Observable<boolean> {
if (this.loggedIn !== null) {
return Observable.of(this.loggedIn);
} else {
return this.http.get('/authenticate?' + credentials)
.map((session: Response) => session.json())
.catch(e => {
// If a server-side login gate returns an HTML page...
return Observable.of(false);
});
}
}
然后在组件中,像往常一样订阅Observable并按需操作。
使用< code>Observable.share()和< code>Observable.replay()还有其他方法可以实现这一点
可观察语法
要回答有关Angular2中Rx观察者语法的部分问题(如果有人Google它),通用形式是:
在服务中:
return this.http.get("/people", null)
.map(res.json())
.catch(console.error("Error in service")
以组件为例:
this.someService.getPeople()
.subscribe(
people => this.people,
error => console.warn('Problem getting people: ' + error),
() => this.doneHandler();
);
正式地:
interface Observer<T> {
onNext(value: T) : void
onError(error: Error) : void
onCompleted() : void
}
当接收到“下一个”值时,调用第一个函数。在REST调用的情况下(最常见的情况),这包含整个结果。
第二个函数是错误处理程序(在服务中调用Observable.trow()的情况下)。
最后一个在结果集为has时调用,并且不带参数。这是您可以调用doSomething()函数的地方。
我想解释一下如何使用Observables,以防您想要更新值,但我不会使用您的示例。我将只展示几行用ES5编写的代码并加以说明。
var updateObservable; // declare here in order to have access to future function
var observable = rx.Observable.create(function (observer) {
observer.next(1);
observer.next(2);
observer.next(3);
// attach a function to the variable which was created in the outer scope
// by doing this, you now have your 'updateObservable' as a function and the reference to it as well
// You will be able to call this function when want to update the value
updateObservable = function (newValue) {
observer.next(newValue);
observer.complete();
};
});
// Suppose you want to update on click. Here actually can be whatever (event) you want
vm.click = function () {
// you can call this function because you have a reference to it
// and pass a new value to your observable
updateObservable(4);
};
// your subscription to changes
observable.subscribe(function(data) {
// after 'click' event will be performed, subscribe will be fired
// and the '4' value will be printed
console.log(data);
});
这里的主要思想是,如果您想更新可观察对象的值,您必须在“创建”函数中执行此操作。如果您在这个“创建”函数中声明一个函数,这将是可能的。
从对我另一个答案的评论中(保留,因为它可能对某人有帮助),您似乎想利用某些东西的力量随着时间的推移发出价值。
正如多姆兹建议的那样,使用主题,但这里有一个(琐碎的)例子来说明如何做到这一点。虽然直接使用Subject显然会有一些陷阱要避免,但我会把它留给你。
import { Component, NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { Observable, Subject } from 'rxjs/Rx';
@Component({
selector: 'my-app',
template: `
<div>
<h2>Open the console.</h2>
</div>
`,
})
export class App {
constructor() {}
let subject = new Subject();
// Subscribe in Component
subject.subscribe(next => {
console.log(next);
});
setInterval(() => {
// Make your auth call and export this from Service
subject.next(new Date())
}, 1000)
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App ],
bootstrap: [ App ]
})
export class AppModule {}
插销
在我看来,对于这个场景,我不明白为什么一个简单的Service/Observable是不够的,但这与我无关。
进一步阅读:角度2-行为主体与可观察?
我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular
我是JavaFX新手,已经开始转换用Swing编写的定制组件。作为最佳实践,我总是检查事件侦听器(PropertyChangeListener、MouseListener、ActionListener等)是否。)已经包含在目标对象的侦听器中,以确保同一个侦听器不会被添加两次。我试图用JavaFX做同样的事情,但是找不到任何访问侦听器列表的方法(例如,运行list.contains(listener
我想创建一个作为源变量:。 我想创建一个可观察的,每次值更改时都会生成提要。 我是说,当我这样做的时候: 在我的代码的某个地方,我希望收到订阅的提要,等等。。。 有什么想法吗?
学习角得到服务和组件和可观察性。 我正在尝试在我的演示应用程序中实现暗模式。该控件由一个服务完成,该服务根据浏览器默认值(如果找到)设置暗主题。 它在应用程序组件中初始化,以便以后在应用程序中放置控制开关。 暗模式从布尔值开始工作,因此为true或false。据我所知,使用一个可观察对象是不够的,因为我希望多个订阅者都以两种方式绑定到订阅,每种方式在服务中切换这些可观察对象。到目前为止,我很肯定这
我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块
我有一个可观察的,可观察的是存储在本地存储器中的一组对象(视频)。我有这样的“功能”将新视频推送到阵列中:视频是一个接口 在其他组件中,我将其称为推送新对象(视频),如下所示: 但这行不通,我知道这是我的错。在observable之前,我使用了经典的常量和函数,工作得很好,现在我在observable方面遇到了麻烦。有人告诉我,我需要订阅一个管道,但我找不到任何地方如何做到这一点。对我来说,可见物