小编Kat*_*nko的帖子

componentDidUpdate()中的setState()

我正在编写一个脚本,根据下拉的高度和屏幕上输入的位置,将输入下移或高于输入.另外,我想根据其方向将修改器设置为下拉列表.但是setState在内部使用componentDidUpdate会创建一个无限循环(很明显)

我已经找到了getDOMNode直接使用和设置classname到dropdown 的解决方案,但我觉得使用React工具应该有更好的解决方案.有谁能够帮我?

这是工作代码的一部分getDOMNode(有点忽略定位逻辑以简化代码)

let SearchDropdown = React.createClass({
    componentDidUpdate(params) {
        let el = this.getDOMNode();
        el.classList.remove('dropDown-top');
        if(needToMoveOnTop(el)) {
            el.top = newTopValue;
            el.right = newRightValue;
            el.classList.add('dropDown-top');
        }
    },
    render() {
        let dataFeed = this.props.dataFeed;
        return (
            <DropDown >
                {dataFeed.map((data, i) => {
                    return (<DropDownRow key={response.symbol} data={data}/>);
                })}
            </DropDown>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

这里是setstate的代码(创建一个无限循环)

let SearchDropdown = React.createClass({
    getInitialState() {
        return {
            top: false
        };
    },
    componentDidUpdate(params) {
        let el = this.getDOMNode();
        if (this.state.top) {
           this.setState({top: …
Run Code Online (Sandbox Code Playgroud)

javascript ecmascript-6 reactjs

104
推荐指数
4
解决办法
11万
查看次数

打字稿 + jasmine.createSpy()

我正在使用 Typescript 为我的 angular 项目编写单元测试

当我尝试为某些服务创建模拟时,我使用这种方式:

const serviceMock = <IMyService>{
    method: _.noop,
};

beforeEach(inject($injector => {
   testingService = new AccountingService(serviceMock);

   spyOn(serviceMock, 'method').and.callFake(()=>'hello');
 }
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是当我尝试使用时jasmine.createSpy(),出现编译错误:

const serviceMock = <IMyService>{
    method: jasmine.createSpy('method').and.callFake(()=>'hello'),
};

Type '{ method: Spy;}' cannot be converted to type 'MyService'. Property 'getParams' is missing in type '{ method: Spy;}'.
Run Code Online (Sandbox Code Playgroud)

但是getParams是私有的方法MyService

我究竟做错了什么?

unit-testing jasmine typescript angular

9
推荐指数
2
解决办法
6735
查看次数

WebStorm 中的路径别名与 webpack 中的路径别名相同

我们的文件结构如下

/common
    /src
        /componentA
        /componentB    
Run Code Online (Sandbox Code Playgroud)

并想使用 webpack 别名

resolve: {
  alias: {
    common: 'common/src'
  }
}
Run Code Online (Sandbox Code Playgroud)

需要像这样的模块

require('common/componentA')
Run Code Online (Sandbox Code Playgroud)

有没有办法教 WebStorm 解决这个问题,通过导航保存选项Ctrl+Click

ResourceRoot 选项对于这种情况没有帮助

javascript webstorm webpack

5
推荐指数
1
解决办法
4273
查看次数

在angular2中使用ts-mockito来模拟getter

我有服务

@Injectable()
export class MyService {
    private _id: string;
    get id(): string {
        return this._id;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个组件测试,我想模拟这个服务:

let myServiceMock = mock<MyService>(MyService);
when(myServiceMock.id).thenReturn('mockId');

TestBed.configureTestingModule({
    imports: [
        MyModule
    ],
    providers: [
        {
            provide: MyService, useValue: instance(myServiceMock)
        }

    ]
});
Run Code Online (Sandbox Code Playgroud)

当测试运行时,我得到undefined了一个id.

是否可以通过mockito模拟吸气剂?

unit-testing angular

4
推荐指数
1
解决办法
1340
查看次数

asynsPipe 生成 null 作为第一个值

当在 Angular 中使用异步管道时,不会立即触发事件(http 请求或任何有延迟的可观察值),第一个值null 是为什么会发生?如何避免这种情况?

<hello [data]="delayedData$|async"> </hello>
Run Code Online (Sandbox Code Playgroud)

第一个改变:

SimpleChange {
   currentValue: null
   firstChange: true
   previousValue: undefined
}
Run Code Online (Sandbox Code Playgroud)

第二个变化:

SimpleChange {
   currentValue: 'some real data'
   firstChange: false
   previousValue: null
}
Run Code Online (Sandbox Code Playgroud)

stackblitz 上的示例: https://stackblitz.com/edit/http-async-pipe-crxm32

rxjs angular async-pipe

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