Javascript AngularJS ng repeat不重新呈现转发器(UI),也不再次调用ng init
我对ng init有点怀疑,实际上我有一些图表Javascript AngularJS ng repeat不重新呈现转发器(UI),也不再次调用ng init,javascript,angularjs,angularjs-ng-repeat,google-pie-chart,Javascript,Angularjs,Angularjs Ng Repeat,Google Pie Chart,我对ng init有点怀疑,实际上我有一些图表 顶部的趋势线 请看下面的图表 HTML表格如下 在页面加载时,我没有显示任何内容,但一旦我第一次单击特定按钮,就会显示http请求接收的数据的整个图表和表格。但之后,如果我单击另一个按钮并执行相同的http请求,那么它将更新趋势线和表,而不是图表。 我的piecharts是在下面的div中使用ng init呈现的,当我测试ng init=“myFunction(index)”方法时,它不会在随后的单击中更新 <form> <m
<form>
<md-input-container>
<label for="myInput">Search Division</label>
<md-icon md-svg-icon="~/Content/myIcons/searchicon/ic_search_black_36px.svg"></md-icon>
<input type="text" id="myInput" ng-model="searchDiv" md-autofocus>
</md-input-container>
<md-content ng-repeat="prod in listofProd | filter: searchDiv">
<md-button class="md-whiteframe-1dp card" ng-click="generateChart(prod)" flex-sm="100" flex-gt-sm="100" flex-gt-md="100">
{{prod}}
</md-button>
</md-content>
</form>
<div layout="row" layout-wrap>
<div flex="25" style="width:1000px;height:300px; border: 1px solid skyblue;" ng-repeat="year in years track by $index" id="piechart{{$index}}" ng-init="myFunction($index)">
</div>
</div>
由于Angular 1.2
,它有一个选项track by
,以防止中继器
从重新渲染所有项到提高性能
有关更多信息,请访问:
这就是为什么自从您在这里使用了track by
以来,在相同的years
呈现的years中不再触发ng init
的原因ng repeat=“year in years track by$index”
即使删除此选项,ng init
也不会第二次触发,因为years
这里是一个数组,其中Angular
非常出色,可以根据其值进行跟踪,尽管没有显式的track by
因此,我们必须将年份
从简单数组更改为对象数组
,比如,[{year:obj.SecuredYear}]
让Angular生成一个$$hashKey
,当对象每次更改时,它是不相同的,Angular将通过触发ng init
重新绘制中继器
那么与此相关的变化是,
Html
<div flex="25" style="width:1000px;height:300px; border: 1px solid skyblue;"
ng-repeat="year in years" id="piechart{{$index}}" ng-init="myFunction($index)">
</div>
JS(myFunction())
我刚刚创建了一个示例代码段,如下所示,用console.log(years[index].year)检查这一点每次单击按钮生成图表时,$scope.myFunction()
内的code>,该函数使用ng init
成功登录
angular.module('myApp',[]);
函数MyCtrl($scope){
var json=[{SecuredYear:1965},{SecuredYear:1988},{SecuredYear:2016},{SecuredYear:2012}];
$scope.generateChart=函数(项){
风险值年数=[];
forEach(函数(obj){
var exists=年。过滤器(功能(y){
返回y.year==对象;
});
if(exists.length==0){
年推送({year:obj.SecuredYear});
}
});
$scope.years=年;
$scope.myFunction=函数(索引){
var数据=[['Product','ValueInDhs']];
forEach(函数(obj){
如果(obj.SecuredYear==年[index].year){
//data.push([String(obj.GroupName.trim(),obj.ValueInDhs]);
console.log(年[索引].year);
}
});
//$scope.displayChart(数据、索引);
};
};
}
生成图表
{{年.年}
angular.module('app'[
“谷歌图表”
])
.controller('appCtrl',function(){
让vm=这个;
vm.charts=[];
vm.addChart=函数(){
vm.charts.push({
键入:“PieChart”,
数据:{
“科尔斯”:[{
id:“t”,
标签:“浇头”,
类型:“字符串”
}, {
id:“s”,
标签:“切片”,
类型:“编号”
}],
“行”:[{
c:[{
五:“蘑菇”
}, {
v:3
}, ]
}, {
c:[{
v:vm.input.name
}, {
v:vm.input.quantity
}]
}, {
c:[{
五:“橄榄”
}, {
v:31
}]
}, {
c:[{
五:“西葫芦”
}, {
v:1
}, ]
}, {
c:[{
v:“意大利香肠”
}, {
v:2
}, ]
}]
}
});
};
返回虚拟机;
});代码>
添加图表
如何绑定ng repeat
数据years
,一次还是每次?你能发布上面提到的onclick
事件的代码吗?每次我想绑定这几年,并且这些年都是正确绑定的,我的意思是每当我点击按钮时,它就会调用http并在那里更新这些年,但在那之后,我的myFunction就没有运行了。我刚刚用year功能更新了上面的代码代码>,只需将其更改为$scope.years=angular.copy(years)代码>。试试这个,我会很快更新答案并说明原因。好的。让我更改并检查。我只是更新了饼图数据,但它没有更改饼图数据。Aruna,它突然开始在draw chart函数的另一部分出错。错误为error:$rootScope:inprog。图表第一次被正确地呈现出来,但是当我再次点击按钮时,它就会给出上面的错误。@Saleem你能告诉我完整的错误吗?你也可以告诉我一个带有错误的角度url。我来看看,阿鲁娜,这是错误的链接。错误出现在$scope.displayChart=函数(dataForChart,index){函数内。如果需要,您可以使用TeamViewer。好的,这是因为$scope.displayChart
函数,$scope.$apply(函数(){chart.draw(数据,选项);}中有这一行);
。您可以删除$scope.$apply(函数(){})
包装器,只需将此行更改为chart.draw(数据、选项)
<div flex="25" style="width:1000px;height:300px; border: 1px solid skyblue;"
ng-repeat="year in years" id="piechart{{$index}}" ng-init="myFunction($index)">
</div>
var years = [];
json.forEach(function (obj) {
var exists = years.filter(function(y) {
return y.year === obj.SecuredYear;
});
if (exists.length === 0) { // This will replace the `indexOf` check
years.push({year: obj.SecuredYear}); // change here
}
});
$scope.years = years;
$scope.myFunction = function (index) {
var data = [['Product', 'ValueInDhs']];
json.forEach(function (obj) {
if (obj.SecuredYear == years[index].year) { // change here at years[index].year
data.push([String(obj.GroupName).trim(), obj.ValueInDhs]);
}
});
$scope.displayChart(data, index);
};