当前位置: 首页 > 知识库问答 >
问题:

TypeError:无法读取未定义的属性“bar”

景理
2023-03-14

无法显示Barchart。

我有一个包含数据的表,它是可拖动的。在表格旁边我有一个两个dropbox被拖动的表格中的数据可以被拖动到框中。当将数据拖动到框中时,应该会显示条形图。

这是我的家。component.html

<div class="placeholders">
    <!--Drag Function-->
    <div class="box1"
    cdkDropList
    #productList="cdkDropList"
    [cdkDropListConnectedTo]="[dropList1,dropList2]"
    [cdkDropListData]="products" 
    (cdkDropListDropped)="drop($event)"
    >
    <div class = "table"> 
    <table class="table table-hover">
        <thead>
            <tr>
                <th>ProductName</th>
                <th>Sales</th>
            </tr>
        </thead>
        <tbody>
            <tr *ngFor = 'let product of products' cdkDrag>
                <td>{{product.productName}}</td>
                <td>{{product.sales}}</td>
            </tr>   
        </tbody>
    </table>
    </div> 
</div>
<!--Dropbox-->
<div class="box2" 
    cdkDropList
    #dropList1="cdkDropList"
    [cdkDropListData]="items" 
    (cdkDropListDropped)="drop($event)"
    [cdkDropListConnectedTo]="[productList]"
    >
    <div *ngFor="let item of items">   
        {{item.productName}} {{item.sales}} 
    </div>  
</div>

<div class="box3"
    cdkDropList
    #dropList2="cdkDropList"
    [cdkDropListData]="values"
    (cdkDropListDropped)="drop($event)"
    [cdkDropListConnectedTo]="[productList]"
    >
    <div *ngFor="let item of values">    
        {{item.productName}}  {{item.sales}} 
    </div>
</div>
</div>

这是我的家。Component.TS

export class HomeComponent implements OnInit {
@ViewChild(barchart) barChart:barchart;
products:any=[];
items:any=[];
values:any=[];
data:any=[];

constructor(private service : ServiceService) { }

//Fetching of data
refreshData(){
  this.service.getAll().subscribe(res => {
  this.products=res;
  })  
} 

drop(event :CdkDragDrop<string[]>){ 
  if (event.previousContainer === event.container) {
    moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
  } else {
    transferArrayItem(event.previousContainer.data, event.container.data , event.previousIndex, event.currentIndex);  
    this.barChart.bar(event.container.data,event.container.id);
  }  
}
  ngOnInit() {
    this.refreshData();
  }
}

这是我的酒吧

import * as d3 from 'd3';

export class barchart{
data=[];
margin = {top: 10, right: 20, bottom: 30, left: 40};

bar(value, id) {
  d3.selectAll("svg").remove(); 
  this.data =value;

const svg  = d3
    .select(id)
    .append('svg')
    .attr('width',150)
    .attr('height',150)

const contentWidth = 200;
const contentHeight = 120;

const x = d3     
    .scaleBand()
    .rangeRound([0, contentWidth])
    .padding(0.1)
    .domain(this.data.map(d => d.productName));

const y = d3
    .scaleLinear()
    .rangeRound([contentHeight, 0])
    .domain([0, d3.max(this.data, d => d.sales)]);

const g = svg.append('g')
    .attr('transform', 'translate(' + this.margin.left + ',' + this.margin.top + ')');

g.append('g')
  .attr('class','x axis')
  .attr('transform', 'translate(0,120)')
  .call(d3.axisBottom(x)); 

g.append('g') 
 .attr('class', 'y axis')
 .call(d3.axisLeft(y))

g.selectAll('.bar')
  .data(this.data)
  .enter()
  .append('rect')
  .attr('class', 'bar')
  .attr("fill",'steelblue')
  .on('mouseover', function(d) {
    d3.select(this)
      .attr('fill', '#3e8e41');
    })
  .on('mouseout',function(d){
    d3.select(this)
      .attr('fill','steelblue')
    })
  .attr('x', d => x(d.productName))
  .attr('y', d => y(d.sales))
  .attr('width', x.bandwidth())
  .attr('height', d => contentHeight - y(d.sales));
  }
}

在拖放数据时,特定的图表必须显示在Dropbox上。

共有2个答案

充星腾
2023-03-14

问题:

drop(event :CdkDragDrop<string[]>){ 
  if (event.previousContainer === event.container) {
    moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
  } else {
    console.log("different container");
    transferArrayItem(event.previousContainer.data, event.container.data , event.previousIndex, event.currentIndex);  
    console.log(event.container.id);
    console.log(event.container)
    this.barChart.bar(event.container.data,event.container.id); <-- problem
  }  
}

修复:

drop(event :CdkDragDrop<string[]>){ 
  if (event.previousContainer === event.container) {
    moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
  } else {
    console.log("different container");
    transferArrayItem(event.previousContainer.data, event.container.data , event.previousIndex, event.currentIndex);  
    console.log(event.container.id);
    console.log(event.container)
    barChart.bar(event.container.data,event.container.id); <-- fix
  }  
}
佟阳焱
2023-03-14

我猜您根本不应该使用@viewchild@ViewChild property Decorator使得可以在视图DOM中查找与选择器匹配的元素或指令,但您的代码似乎在HTML中没有Barchart指令或选择器。所以这个.barchart总是未定义。但是,您可以使用一个类barchart。您应该创建barchart的实例并调用bar:

// home.component.ts
// import your barchar class
import { barchart } from './pathtobarchart';

_barchart: barchart;

constructor(private service : ServiceService) {
  // create an instance of barchart class,
  // so you can use it inside the methods of
  // your HomeComponent
  this._barchart = new barchart();
}

drop(event :CdkDragDrop<string[]>) {
  if (event.previousContainer === event.container) {
    moveItemInArray(event.container.data, event.previousIndex, 
    event.currentIndex);
  } else {
   transferArrayItem(event.previousContainer.data, event.container.data , event.previousIndex, event.currentIndex);  
   this._barchart.bar(event.container.data,event.container.id);
  }  
}
 类似资料:
  • 如果函数在组件中,那么一切都很好。如果我把它单独取出并导出到一个组件中,那么我会得到一个错误TypeError:不能读取未定义的属性(读取'reduce')

  • 问题内容: 我试图在ajax回调从REST api接收数据后设置组件的setState。这是我的组件构造函数代码 然后,我有一个如下所示的方法。 现在,这是我执行getAJAX请求的getPosts函数。 我想设置状态,但出现以下错误。 不太清楚是什么原因造成的。如果有人指出我正确的方向,那将真的很有帮助。提前致谢。 问题答案: 还绑定回调函数,以便回调内部指向React Component的上下

  • 我试图使用node.js express web服务器中的@tensorflow/tfjs-node模块。但是,我得到了下面的错误。我不明白为什么我会出现这个错误。我刚刚在node.js服务器中添加了1行代码。我使用“npm install@tensorflow/tfjs-node”完成的安装。可能的问题是什么? null 先谢谢你, var nonMaxSuppressionV3Impl=tf.

  • 我正在尝试联系许多对许多,在两个模式“培训和培训课程”,所以我做了第三个模式“课程”,以尝试关系1对许多。但是我得到了一个错误: null TypeError:无法读取对象上未定义得属性“belongsto”。(c:UsersDellDownloadsGraphql-12.18.2020Graphql-12.18.2020Graphql-12.18.2020ServerAppDatabaseDat

  • 上面的函数返回一个类似“failed”的字符串。但是,当我尝试在其上运行then函数时,它将返回 并且光标指示在之后和。 下面是完整的功能: 更新 下面是函数 我确信将导致一个“failed”字符串。没别的了。

  • 我被困在这个错误上:类型错误:无法读取未定义的属性'getText'当我在量角器v.4.0.14中运行我的测试时,我所理解的是getText()无法从表单元格中获取文本,因为CSS选择器没有正确地选择它,或者我使用错误的方法从单元格检索文本?! 我的页面对象文件的代码: 以下是规范文件的代码: 这是一条错误消息: 失败:1)通讯录应能够搜索保存的联系人消息:失败:无法读取未定义堆栈的属性“getT