Emitting event from service for specific component
Hello i have the following problem.
I have a recursive component NodeComponent
with which i create a TreeView
.
The problem is that i do not know how to deal when i am disposing the root Node
.
For deleting particular nodes in the hierarchy i call a service to which i pass the current node and its parent.The services then splices
the element away and ngFor
takes care of it visually.
For the root how can i notify the `container component to close the whole thing down?
Model
export interface TreeModel{
id:string;
children:Array<TreeModel>;
}
Container Component
export class TreeViewComponent implements OnInit {
constructor(private treeService: HtmlGeneratorService) {
}
ngOnInit() {
}
public root: TreeModel;
}
<div class="row">
<app-node [model]="root" [parent]="null" [settings]="settings" ></app-node>
</div>
Recursive Component
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.css']
})
export class NodeComponent implements OnInit, OnChanges {
public isExpanded:boolean=true;
constructor(private htmlService:HtmlGeneratorService) { }
onDelete():void{
if(this.parent==null){
}
this.htmlService.deleteNode(this.parent,this.model);
}
public onExpand():void{
this.isExpanded=!this.isExpanded;
}
@Input()
public model:TreeModel;
@Input()
public parent:TreeModel;
}
<div class="content-delete"><button (click)="onDelete()">Delete</button>
</div>
<div>
<ul>
<li *ngFor="let item of model.children">
<div class="childNode">
<app-node [parent]="model" [model]="item"></app-node>
</div>
</li>
</ul>
</div>
DeleteService
export class HtmlGeneratorService {
public deleteNode(parent:TreeModel,child:TreeModel){
if(parent==null){
//do what ? i can i emit an event that the `TreeViewComponent` can respond?
}
var childIndex=parent.children.findIndex(x=>x.id==child.id);
parent.children.splice(childIndex,1);
}
}
As you can see in my service i do not know how to notify my TreeViewComponent
.The only solution that i see is i have to have a special field
in my NodeComponent
that would get set true only for the root component.If i would do it like this ..wouldn't it be inefficient?Basically allocating a variable in all Nodes
just for checking for root -to be used by the container ?
typescript recursion emit
add a comment |
Hello i have the following problem.
I have a recursive component NodeComponent
with which i create a TreeView
.
The problem is that i do not know how to deal when i am disposing the root Node
.
For deleting particular nodes in the hierarchy i call a service to which i pass the current node and its parent.The services then splices
the element away and ngFor
takes care of it visually.
For the root how can i notify the `container component to close the whole thing down?
Model
export interface TreeModel{
id:string;
children:Array<TreeModel>;
}
Container Component
export class TreeViewComponent implements OnInit {
constructor(private treeService: HtmlGeneratorService) {
}
ngOnInit() {
}
public root: TreeModel;
}
<div class="row">
<app-node [model]="root" [parent]="null" [settings]="settings" ></app-node>
</div>
Recursive Component
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.css']
})
export class NodeComponent implements OnInit, OnChanges {
public isExpanded:boolean=true;
constructor(private htmlService:HtmlGeneratorService) { }
onDelete():void{
if(this.parent==null){
}
this.htmlService.deleteNode(this.parent,this.model);
}
public onExpand():void{
this.isExpanded=!this.isExpanded;
}
@Input()
public model:TreeModel;
@Input()
public parent:TreeModel;
}
<div class="content-delete"><button (click)="onDelete()">Delete</button>
</div>
<div>
<ul>
<li *ngFor="let item of model.children">
<div class="childNode">
<app-node [parent]="model" [model]="item"></app-node>
</div>
</li>
</ul>
</div>
DeleteService
export class HtmlGeneratorService {
public deleteNode(parent:TreeModel,child:TreeModel){
if(parent==null){
//do what ? i can i emit an event that the `TreeViewComponent` can respond?
}
var childIndex=parent.children.findIndex(x=>x.id==child.id);
parent.children.splice(childIndex,1);
}
}
As you can see in my service i do not know how to notify my TreeViewComponent
.The only solution that i see is i have to have a special field
in my NodeComponent
that would get set true only for the root component.If i would do it like this ..wouldn't it be inefficient?Basically allocating a variable in all Nodes
just for checking for root -to be used by the container ?
typescript recursion emit
add a comment |
Hello i have the following problem.
I have a recursive component NodeComponent
with which i create a TreeView
.
The problem is that i do not know how to deal when i am disposing the root Node
.
For deleting particular nodes in the hierarchy i call a service to which i pass the current node and its parent.The services then splices
the element away and ngFor
takes care of it visually.
For the root how can i notify the `container component to close the whole thing down?
Model
export interface TreeModel{
id:string;
children:Array<TreeModel>;
}
Container Component
export class TreeViewComponent implements OnInit {
constructor(private treeService: HtmlGeneratorService) {
}
ngOnInit() {
}
public root: TreeModel;
}
<div class="row">
<app-node [model]="root" [parent]="null" [settings]="settings" ></app-node>
</div>
Recursive Component
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.css']
})
export class NodeComponent implements OnInit, OnChanges {
public isExpanded:boolean=true;
constructor(private htmlService:HtmlGeneratorService) { }
onDelete():void{
if(this.parent==null){
}
this.htmlService.deleteNode(this.parent,this.model);
}
public onExpand():void{
this.isExpanded=!this.isExpanded;
}
@Input()
public model:TreeModel;
@Input()
public parent:TreeModel;
}
<div class="content-delete"><button (click)="onDelete()">Delete</button>
</div>
<div>
<ul>
<li *ngFor="let item of model.children">
<div class="childNode">
<app-node [parent]="model" [model]="item"></app-node>
</div>
</li>
</ul>
</div>
DeleteService
export class HtmlGeneratorService {
public deleteNode(parent:TreeModel,child:TreeModel){
if(parent==null){
//do what ? i can i emit an event that the `TreeViewComponent` can respond?
}
var childIndex=parent.children.findIndex(x=>x.id==child.id);
parent.children.splice(childIndex,1);
}
}
As you can see in my service i do not know how to notify my TreeViewComponent
.The only solution that i see is i have to have a special field
in my NodeComponent
that would get set true only for the root component.If i would do it like this ..wouldn't it be inefficient?Basically allocating a variable in all Nodes
just for checking for root -to be used by the container ?
typescript recursion emit
Hello i have the following problem.
I have a recursive component NodeComponent
with which i create a TreeView
.
The problem is that i do not know how to deal when i am disposing the root Node
.
For deleting particular nodes in the hierarchy i call a service to which i pass the current node and its parent.The services then splices
the element away and ngFor
takes care of it visually.
For the root how can i notify the `container component to close the whole thing down?
Model
export interface TreeModel{
id:string;
children:Array<TreeModel>;
}
Container Component
export class TreeViewComponent implements OnInit {
constructor(private treeService: HtmlGeneratorService) {
}
ngOnInit() {
}
public root: TreeModel;
}
<div class="row">
<app-node [model]="root" [parent]="null" [settings]="settings" ></app-node>
</div>
Recursive Component
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.css']
})
export class NodeComponent implements OnInit, OnChanges {
public isExpanded:boolean=true;
constructor(private htmlService:HtmlGeneratorService) { }
onDelete():void{
if(this.parent==null){
}
this.htmlService.deleteNode(this.parent,this.model);
}
public onExpand():void{
this.isExpanded=!this.isExpanded;
}
@Input()
public model:TreeModel;
@Input()
public parent:TreeModel;
}
<div class="content-delete"><button (click)="onDelete()">Delete</button>
</div>
<div>
<ul>
<li *ngFor="let item of model.children">
<div class="childNode">
<app-node [parent]="model" [model]="item"></app-node>
</div>
</li>
</ul>
</div>
DeleteService
export class HtmlGeneratorService {
public deleteNode(parent:TreeModel,child:TreeModel){
if(parent==null){
//do what ? i can i emit an event that the `TreeViewComponent` can respond?
}
var childIndex=parent.children.findIndex(x=>x.id==child.id);
parent.children.splice(childIndex,1);
}
}
As you can see in my service i do not know how to notify my TreeViewComponent
.The only solution that i see is i have to have a special field
in my NodeComponent
that would get set true only for the root component.If i would do it like this ..wouldn't it be inefficient?Basically allocating a variable in all Nodes
just for checking for root -to be used by the container ?
typescript recursion emit
typescript recursion emit
edited Nov 23 '18 at 10:00
Bercovici Adrian
asked Nov 23 '18 at 9:49
Bercovici AdrianBercovici Adrian
1,0801816
1,0801816
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53444222%2femitting-event-from-service-for-specific-component%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53444222%2femitting-event-from-service-for-specific-component%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown