【问题标题】:Cannot assign to a services local variable using observables无法使用 observables 分配给服务局部变量
【发布时间】:2017-06-18 14:57:21
【问题描述】:

总结

我正在尝试通过将 JobService jobs:Job[] 变量分配给请求的结果,将 HTTP 结果缓存到本地变量中。然后,我希望从另一个注入JobService 的组件中过滤调用setSearch() 函数的结果。

UserService 检索到用户时,JobService 订阅事件并获取作业。这意味着如果用户状态发生变化,作业数组也会发生变化。然后调用setJobs() 设置本地jobs 变量

稍后当用户在搜索框中输入时,setSearch() 被调用,this.jobs 是一个空数组,即使它是在 setJobs() 中设置的

jobsPublisher 然后将这组新作业发布给订阅者。

注意HttpCacheServiceHttp 非常相似,但它只是将响应映射到所需的对象,同时处理和记录错误。

工作服务

@Injectable()
export class JobService {
    jobsPublisher: BehaviorSubject<Job[]>
    private jobs: Job[] = []

    constructor(
        private http: HttpCacheService<Job[]>,
        private userService: UserService,
        private searchService: SearchService
    ) {
        this.jobsPublisher = new BehaviorSubject<Job[]>(this.jobs)

        this.userService.userPublisher.subscribe((user: User) => {
            this.getJobs()
        })
    }

    private getJobs(): void {
        let req = this.http.GET("/d/jobs").subscribe(jobs => {
            this.setJobs(jobs) // jobs = Array(100)
            this.jobsPublisher.next(jobs)
            req.unsubscribe()
        })
    }

    private setJobs(jobs) {
        console.log("Setting jobs!")
        this.jobs = jobs // this.job = jobs = Array(100)
    }

    setSearch(query: string) { // this.jobs = []
        let newJobs = this.filterJobs(query, this.jobs)
        console.log(`Job Length Filter [${this.jobs.length}] -> [${newJobs.length}]`)
        this.jobsPublisher.next(newJobs)
    }

    private filterJobs(query: string, jobs: Job[]): Job[] {
         // Filter jbos
    }
}

作业列表组件

export class JobsListComponent implements OnInit {
  public jobrows: Array<Array<Job>> = []

  constructor(private jobService: JobService, private searchService: SearchService) { }

  ngOnInit() {
    this.jobService.jobsPublisher.subscribe((jobs: Job[]) => {
      this.genRows(jobs)
    })
  }

  private genRows(jobs: Array<Job>): void {
    this.jobrows = []
    while (jobs.length > 0) 
      this.jobrows.push(jobs.splice(0, 3))
  }

  search(event: any): void {
    this.jobService.setSearch(event.target.value || "")
  }
}

Not working

Working as expected

【问题讨论】:

  • 问题是什么,您是否遇到错误?你在期待什么,正在发生什么。理想情况下,您不应该在服务中使用 subscribe
  • @Skeptor 当setSearch() 被调用时,this.jobs 是一个空数组。
  • 你能说明你是如何从组件调用服务的吗?
  • @Skeptor 我添加了组件
  • filterJobs 的实际内容是什么?因为它现在在您给出的代码中只是一个注释。它实际上是您代码中的注释吗?如果不是,请输入足够的代码,这样我们就不必假设您做的事情正确。

标签: angular rxjs angular2-services angular2-observables


【解决方案1】:
  private genRows(jobs: Array<Job>): void {
    jobs = jobs || []
    this.jobrows = []
    while (jobs.length > 0) 
      this.jobrows.push(jobs.splice(0, 3))
  }

是你改变数组的罪魁祸首。

将其转换为:

          this.jobrows.push(jobs.slice(0, 3))

【讨论】:

  • 感谢@Ced 的这些建议。是的,这是一个奇怪的不知道发生了什么。我正在为你做一个 plunker,如果它在那里工作,你会很生气。
  • 当然可以embed.plnkr.co/vcDfB0tmA7ByTCR8Yi2r 不知道为什么它在我的项目中不起作用
  • @Cred 所以我做了一个包含服务器等的仓库:github.com/lengk/bug-observable
  • 我还尝试查看您建议的 getter 和 setter 实现是否有任何区别,但它没有:(
  • @Harry 我并不是说它会有所作为,我的意思是它会帮助您解决问题。如果您需要更多帮助,我建议您使用 angular gitter。 gitter.im/angular/angular
猜你喜欢
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2018-10-24
  • 2013-11-06
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多