- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 angular2 工作。我正在将数据从一个父组件传递到另一个子组件。
<app-datatable-repr [myFilterData]="filterData"></app-datatable-repr>
filterData 是一个对象。
第一次 OnChanges 检测到 "filterData"
的变化,但第二次 ngChange 没有检测到 "filterData"
的变化。
如何解决这个问题?
har-file-upload.component.ts
import { Component, OnInit } from '@angular/core';
import { HarFileServiceService } from '../har-file-service.service';
@Component({
selector: 'app-har-file-upload',
templateUrl: './har-file-upload.component.html',
styleUrls: ['./har-file-upload.component.css']
})
export class HarFileUploadComponent implements OnInit {
constructor(private harFileServiceService:HarFileServiceService) { }
ngOnInit() {
}
filterData:Object = {};
changeListener(event:any){
var that = this;
var file = event.target.files[0];
var myReader = new FileReader();
var harFile = this.harFileServiceService;
myReader.onload = function(e:any){
var jsonData = JSON.parse(e.target.result);
harFile.render(jsonData);
that.filterData = harFile.responseFileData;
// console.log(that.filterData)
}
// console.log(file);
myReader.readAsText(file);
}
}
har-file-service.service.ts
import { Injectable } from '@angular/core';
import * as $ from 'jquery';
@Injectable()
export class HarFileServiceService {
constructor() { }
log:Object = { entries: {} };
totals:Object = {};
pads:Object = {};
left;
right;
idctr:number = 0;
reqCount:number = 0;
totalReqSize:number = 0;
totalRespSize:number = 0;
requestObj:Object = {'resources':[]};
responseFileData:any = {};
render(har: any) {
var pageref;
var that = this;
$.each(har.log.entries, function (index, entries) {
console.log(index, entries);
var singleReqOb = {};
that.requestObj['resources'].push(singleReqOb);
pageref = pageref || entries.pageref;
if(entries.pageref === pageref) {
that.entry(index, entries);
}
});
this.responseFileData = this.requestObj;
console.log(this.responseFileData);
}
entry(id:any, entry:any) {
id = id || this.idctr++;
this.log['entries'][id] = entry;
var t = new Date(entry.startedDateTime).getTime();
if(this.left && this.right) {
this.left = (this.left < t) ? this.left : t;
this.right = (this.right > t) ? this.right : t;
}
else {
this.left = this.right = t;
}
if(entry.request) {
this.request(id, entry.request);
}
if(entry.response) {
this.response(id, entry.response);
}
}
request(id:any, request:any) {
if(this.log['entries'][id]) {
this.log['entries'][id].request = request;
}
else {
this.log['entries'][id] = {
id: id,
request: request
};
}
this._updateRequest(id, request);
this.reqCount = this.reqCount + 1;
if(request.headersSize && request.headersSize > 0) {
this.totalReqSize = this.totalReqSize + request.headersSize;
}
if(request.bodySize && request.bodySize > 0) {
this.totalReqSize = this.totalReqSize + request.bodySize;
}
}
response(id:any, response:any) {
if(this.log['entries'][id]) {
this.log['entries'][id].response = response;
this._updateResponse(id, response);
if(response.headersSize && response.headersSize > 0) {
this.totalRespSize = this.totalRespSize + response.headersSize;
}
if(response.bodySize && response.bodySize > 0) {
this.totalRespSize = this.totalRespSize + response.bodySize;
}
}
else {
}
}
_updateRequest(id:any, request:any) {
var reqObj = this.requestObj['resources'][id];
if(request.url) {
reqObj['filePath'] = request.url;
}
};
_updateResponse(id:any, response:any) {
var reqObj = this.requestObj['resources'][id];
var type = response.content.mimeType;
var type_0 = type.split("/")[0];
var type_1 = type.split("/")[1];
switch (type_1) {
case "javascript":
case "x-javascript":
reqObj['type'] = 'script';
break;
case "css":
case "json":
case "html":
reqObj['type'] = type_1;
break;
case "x-shockwave-flash":
reqObj['type'] = 'flash';
break;
default:
reqObj['type'] = type;
break;
}
if(type_0 == 'image' || type_0 == 'video'){
reqObj['type'] = type_0;
reqObj['type'] = (reqObj['type'] == 'image') ? 'image' : reqObj['type'];
}
if(response.content && response.content.text) {
reqObj['size'] = response.bodySize;
}else{
reqObj['size'] = '';
}
}
}
这里是 ngOnChange
import { Component, OnInit , OnChanges, SimpleChanges, Input} from '@angular/core';
import * as $ from 'jquery';
import 'datatables.net'
import { HarFileServiceService } from '../har-file-service.service';
@Component({
selector: 'app-datatable-repr',
templateUrl: './datatable-repr.component.html',
styleUrls: ['./datatable-repr.component.css']
})
export class DatatableReprComponent implements OnInit, OnChanges {
@Input() myFilterData;
constructor(private harFileServiceService:HarFileServiceService) { }
public tableWidget: any;
ngOnInit() {
this.initDatatable();
}
ngOnChanges(changes:SimpleChanges){
if(changes.myFilterData.currentValue.hasOwnProperty('resources')){
this.tableWidget.clear().draw();
this.tableWidget.rows.add(changes.myFilterData.currentValue.resources); // Add new data
this.tableWidget.columns.adjust().draw(); // Redraw the DataTable
}
}
private truncate(string:any, len:any){
if (string.length > len)
return string.substring(0,len)+'...';
else
return string;
};
parseURL(url:any) {
var parsed_url:any = {}
if (url == null || url.length == 0) return parsed_url;
var protocol_i = url.indexOf('://');
parsed_url.protocol = url.substr(0, protocol_i);
var remaining_url = url.substr(protocol_i + 3, url.length);
var domain_i = remaining_url.indexOf('/');
domain_i = domain_i == -1 ? remaining_url.length - 1 : domain_i;
parsed_url.domain = remaining_url.substr(0, domain_i);
parsed_url.path = domain_i == -1 || domain_i + 1 == remaining_url.length ?
null : remaining_url.substr(domain_i + 1, remaining_url.length);
var domain_parts = parsed_url.domain.split('.');
switch (domain_parts.length) {
case 2:
parsed_url.subdomain = null;
parsed_url.host = domain_parts[0];
parsed_url.tld = domain_parts[1];
break;
case 3:
parsed_url.subdomain = domain_parts[0];
parsed_url.host = domain_parts[1];
parsed_url.tld = domain_parts[2];
break;
case 4:
parsed_url.subdomain = domain_parts[0];
parsed_url.host = domain_parts[1];
parsed_url.tld = domain_parts[2] + '.' + domain_parts[3];
break;
}
parsed_url.parent_domain = parsed_url.host + '.' + parsed_url.tld;
return parsed_url;
}
imgExt:any = ["png", "gif", "jpeg", "jpg"]
vidExt:any = ["mov", "flv", "mpg", "mpeg", "mp4", "ogv", "webm"]
private initDatatable(): void {
var myData = this.myFilterData.hasOwnProperty('responseFileData') ? this.myFilterData.hasOwnProperty('responseFileData') : {};
var that = this;
let exampleId: any = $('#resourcesListing');
this.tableWidget = exampleId.DataTable({
aLengthMenu : [],
aaData: myData,
bPaginate: false,
bAutoWidth: false,
order: [],
language: {
search: "Search Resources : ",
lengthMenu: "Display _MENU_ Resources",
infoFiltered: "(filtered from _MAX_ Resources)",
info: "Showing _START_ to _END_ of _TOTAL_ Resources",
infoEmpty: "",
zeroRecords: "<div style='padding: 10px;'>No resources match your search criteria.</div>",
emptyTable: "<div style='padding: 10px;'>No resources available.</div>",
paginate: {
first: " <i class='fa fa-fast-backward'></i> ",
previous: " <i class='fa fa-backward'></i> ",
next: " <i class='fa fa-forward'></i> ",
last: " <i class='fa fa-fast-forward'></i> "
}
},
aoColumns: [
{
mDataProp: 'filePath',
mRender: function (data, type, full) {
var urlinfo = (that.parseURL(data));;
return that.truncate(urlinfo.domain, 50);
},
sWidth: "200px"
},
{
mDataProp: 'filePath',
mRender: function (data, type, full) {
var urlinfo = (that.parseURL(data));
return "<a target='_blank' href='"+data+"'/>" + that.truncate(urlinfo.path ? urlinfo.path.split("?")[0] : "", 60) + "</a>";
},
sWidth: "400px"
},
// {
// mData: "filePath",
// mRender: function (data, type, full) {
// return '<a href="#" class="info"><i class="fa fa-info" aria-hidden="true"></i></a>';
// },
// sWidth: "60px",
// sClass: "center"
// },
{
mData: "type",
sWidth: "100px",
mRender: function (data, type, full) {
var resType = data,
resPath = full['filePath'];
if(resType == "css"){
// background-url will have type css, change to bg-img
var ext = resPath.split('.').pop();
if(that.imgExt.indexOf(ext) >= 0){
// showResType = "bg-img";
resType = "bg-image";
}
}else if(resType == "other" || resType == ""){
// video comes as type 'other' in firefox and empty in chrome
var ext = resPath.split('.').pop();
if(that.vidExt.indexOf(ext) >= 0){
// showResType = "video";
resType = "video";
}
}else if(resType == "img"){
resType = "image";
}
return resType;
}
},
{
mDataProp: 'filePath',
mRender: function (data, type, full) {
return (full.type == "image" || full.type == "img") ? '<div class="imageBackgroundParent"><div class="imageBackground" style="background-image: url('+ data +');"></div></div>' : "";
},
sWidth: "120px",
sClass: "center"
},
{
mData: "size",
sWidth: "80px"
}
],
});
}
}
样本数据
"resources":[
{
"filePath": "http://www.cricbuzz.com/live-cricket-scores/18460/sl-vs-ind-2nd-test-india-tour-of-sri-lanka-2017",
"type": "html",
"size": 119362
},
{
"filePath": "http://gc.kis.v2.scr.kaspersky-labs.com/EAA2612E-9291-A04E-A659-D0B272EEC835/main.js",
"type": "script",
"size": 104685
},
{
"filePath": "http://i.cricketcb.com/statics/site/images/cbz-logo.png",
"type": "image",
"size": 0
}
]
最佳答案
因为对象是可变的,所以 ngOnChange() 没有被调用。发生这种情况是因为 ngOnChange() 它仅在参数实例更改时触发(而不是其中一个属性)。
您可以阅读更多相关信息 here
您可以利用不可变对象(immutable对象)。这意味着该对象无法更改。有一个很棒的图书馆,名为 immutable.js by facebook .
您还可以使用 Object.assign() .当您使用它时,您正在创建对象的新实例(而不是更改引用)。
长话短说,
constructor(private harFileServiceService:HarFileServiceService) { }
ngOnInit() {
}
filterData:Object = {};
changeListener(event:any){
var file = event.target.files[0];
var myReader = new FileReader();
var harFile = this.harFileServiceService;
myReader.onload = (e:any)=>{
var jsonData = JSON.parse(e.target.result);
harFile.render(jsonData);
this.filterData = Object.assign({},harFile.responseFileData);
}
// console.log(file);
myReader.readAsText(file);
}
}
在上面的示例中,我使用了 Object.assign()。此外,我稍微更改了语法并使用了 ecmascript arrow function .
关于angular - ngOnChange() 在 angular2 中第二次不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45898716/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!