【问题标题】:Angular2 scope's and componentsAngular2范围和组件
【发布时间】:2016-05-26 05:10:55
【问题描述】:

全部,

这就是我所拥有的:

用户列表.component.ts

export class UserListComponent {

    public userSerivce: UserService;

    public deleteUser(id) {
        this.userSerivce.delete(id);
    }
}

用户列表.component.html

<div>
    <some-reusable[deleteFunc]="delete" > </some-reusable><!-- this will bind "delete" on the user- list.component, to "deleteFunc" on  SomeReusableComponent-->
</div>

some-reusable.component.ts

export class SomeReusableComponent {    
    @Input() deleteFunc: Function;    
}

some-reusable.component.html

<button type="button" (click)="deleteFunc(entityId)" aria-label="Delete" >
    <span class="glyphicon glyphicon-trash" aria-hidden="true"> </span>
</button>

这是我的问题:

当我单击按钮时,它调用 UserListComponent 上的函数就好了,但是当提到 this 时,它也引用 SomeReusableComponent,我理解为什么会发生这种情况,但我正在寻找一个解决方案?您可以在上面的示例中看到对this.userSerivce.delete(id); 的调用将失败,因为userServiceSomeReusableComponent 上不存在。

我希望上面的例子有意义。

谢谢

史蒂夫

【问题讨论】:

    标签: typescript angular angular2-directives angular2-services


    【解决方案1】:

    完全同意@Günter!

    关于你的this 问题,这是因为你在引用一个函数(甚至是一个对象)时丢失了this。为了防止这种情况,您可以使用函数的bind 方法:

    delete.bind(this)
    

    【讨论】:

    • 感谢@Thierry 提供的信息。
    【解决方案2】:

    我认为更好的方法是使用事件绑定

    export class SomeReusableComponent {    
        @Output itemDeleted:EventEmitter = new EventEmitter();
    
        handleDelete(entityId) {
          itemDeleted.emit(entityId);
        }
    }
    
    <button type="button" (click)="handleDelete(entityId)" aria-label="Delete" >
        <span class="glyphicon glyphicon-trash" aria-hidden="true"> </span>
    </button>
    
    <some-reusable (itemDeleted)="delete($event)" > </some-reusable>
    

    【讨论】:

    • 我不知道 EventEmitter 所以谢谢!这是一种享受,你认为这是目前处理这类事情的最佳方式吗?它是未来的证明吗?或者你认为 angular2 将来会自己处理这种情况?
    • 我认为我在回答中展示的方式是 Angular2 的方式。如果您仍想传递函数,请使用 Thierry 在他的回答中解释的内容,但如果没有强有力的理由,我会不鼓励。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2016-09-13
    • 1970-01-01
    • 2018-01-20
    相关资源
    最近更新 更多