当用户点击按钮时,我试图打开一个新窗口,如下所示:

protected assignActity(type: string): void {
    var window = window.open('/#/link');
    this.Service.assignActivity(type).subscribe(res => {
      window.location = '/#/link/' + res;
      console.log(res);
    })
  }

但这是一个错误:

core.umd.js:3468 TypeError: Cannot read property 'open' of undefined

如何纠正它以使其正常工作?

推荐答案

window变量为undefined的原因是you have declared a variable named window again in the local scope.

根据javascript/typescript的范围规则,在访问全局变量之前,将查找局部变量值.

因此,您所要做的只是更改捕获打开的选项卡引用的变量名

var newWindow = window.open('some_url');

但是,这不是推荐的方法,因为angular2应用程序可以在各种环境中运行,例如移动或渲染服务器端,其中window个对象可能可用,也可能不可用.更不用说在测试中模拟窗口对象是非常困难的

相反,您可以将window对象包装在一个服务中,并将该服务注入到您的组件中.通过这种方式,您可以根据环境简单地使用Dependency injection替换service实现

The service file

@Injectable()
export class WindowRef {
    constructor() {}

    getNativeWindow() {
        return window;
    }
}

The component file

@Component({
  selector : 'demo',
  template : '<div> Demo </div>'
})
class DemoComponent {

   nativeWindow: any
   constructor( private winRef: WindowRef ) { 
       this.nativeWindow = winRef.getNativeWindow();
   }

    protected assignActity(type: string): void {
       var newWindow = this.nativeWindow.open('/#/link');
       this.Service.assignActivity(type).subscribe(res => {

       newWindow.location = '/#/link/' + res;
       console.log(res);
    })
}

Typescript相关问答推荐

为什么AB和CD这两种类型在TypScript中可以相互分配?

如何将@for的结果绑定到变量?

泛型函数类型验证

TypeScript Page Routing在单击时不呈现子页面(React Router v6)

HttpClient中的文本响应类型选项使用什么编码?''

对深度对象键/路径进行适当的智能感知和类型判断,作为函数参数,而不会触发递归类型限制器

如何将类型从变量参数转换为返回中的不同形状?

如何使用Zod使一个基于其他字段值的字段为必填字段?

ANGLE找不到辅助‘路由出口’的路由路径

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

在类型脚本中的泛型类上扩展的可选参数

是否可以针对联合类型验证类型属性名称?

记录键的泛型类型

vue-tsc失败,错误引用项目可能无法禁用vue项目上的emit

React router 6(数据路由)使用数据重定向

在Cypress中,是否可以在不标识错误的情况下对元素调用.Click()方法?

类型脚本-在调用期间解析函数参数类型

在Thunk中间件中输入额外参数时Redux工具包的打字脚本错误

如何正确键入泛型相对记录值类型?

定义一个只允许来自另一个类型的特定字符串文字的类型的最佳方式