当前位置: 首页 > 知识库问答 >
问题:

打字稿角度 - 可观察:如何更改其值?

阙阳夏
2023-03-14

也许我错过了什么。我找不到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?? 
    }

}

共有3个答案

郭璞
2023-03-14

管理登录状态

对于这个实现,您只需要一个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()函数的地方。

益智明
2023-03-14

我想解释一下如何使用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);
});

这里的主要思想是,如果您想更新可观察对象的值,您必须在“创建”函数中执行此操作。如果您在这个“创建”函数中声明一个函数,这将是可能的。

雷硕
2023-03-14

从对我另一个答案的评论中(保留,因为它可能对某人有帮助),您似乎想利用某些东西的力量随着时间的推移发出价值。

正如多姆兹建议的那样,使用主题,但这里有一个(琐碎的)例子来说明如何做到这一点。虽然直接使用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方面遇到了麻烦。有人告诉我,我需要订阅一个管道,但我找不到任何地方如何做到这一点。对我来说,可见物