小编Eri*_*icJ的帖子

从服务触发组件视图的更新 - 没有ChangeDetectorRef的提供者

我想用udpate我的应用程序视图,由服务事件触发.

我的一个服务注入了ChangeDetectorRef.编译工作正常,但是当App被引导时,我在浏览器中出现错误:No provider for ChangeDetectorRef!.

我以为我需要将它添加到我的AppModule中,但我找不到任何表明它在我可以导入的模块中的文档.我尝试将类本身添加到导入数组,但这导致了错误.尝试将其添加到模块中的providers数组时,我也遇到错误.这是我的服务的简化版本:

import {Injectable, ChangeDetectorRef } from '@angular/core';

@Injectable()
export class MyService {
  private count: number = 0;
  constructor(private ref: ChangeDetectorRef){}

  increment() {
    this.count++;
    this.ref.detectChanges();
}
Run Code Online (Sandbox Code Playgroud)

和app模块:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { MyService } from './my.service';

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent ],
  providers: [ MyService ],
  booststrap: [ AppComponent ]
})
export AppModule {}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我已经尝试删除我对ChangeDetectorRef的使用,但我仍然遇到同样的问题.我猜我更新了我的System …

typescript angular2-changedetection angular

40
推荐指数
2
解决办法
2万
查看次数

如何在 d3.js 中更改缩放行为的插值

我正在使用 d3.js V 4.0 在 SVG 中提供缩放和平移。我正在实施一个重置按钮,让我回到图像的中心。它正在工作,但它使用默认的 d3.interpolateZoom,因此图像在过渡期间会缩小。我只希望缩放进行标准插值,但我无法弄清楚如何更改缩放行为的插值器。这是代码的缩写版本:

var map = document.querySelector('#map');
var everything = d3.select('#everything');
var zoomBehavior = d3.zoom();
zoomBehavior.scaleExtent([0.5, 10])
  .on('zoom', zoomed);
d3.select(map).call(zoomBehavior);

function zoomed() {
  everything.attr('transform', d3.event.transform);
}

function reset() {
  d3.select(this.map)
    .transition()
    .duration(1000)
    .call(zoomBehavior.transform, d3.zoomIdentity);
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.1.0/d3.min.js"></script>
<svg id="map" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <g id="everything">
    <circle r="5" cx="50" cy="15"></circle>
  </g>
</svg>
<button onclick="reset()">reset</button>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有表现出我所看到的行为。(在我的真实版本中,比例 k 使用van Wijk 平滑缩放通过 0 插入)但问题仍然有效。如果我要更改此缩放行为的插值器,我将如何以及在何处执行此操作?我曾尝试调用文档似乎建议的 zoomBehavior.interpolate(d3.interpolate),但我收到一条错误消息,指出 zoomBehavior.interpolate 不是函数。

javascript d3.js

2
推荐指数
1
解决办法
1572
查看次数