通过角工厂数据馈送到控制器 [英] Feeding the data through an angular factory to a controller
问题描述
我试图通过一个角工厂函数来检索JSON数据并将该数据供给到控制器以创建图表(highchart)对象。然而,这给了我一个参数工厂函数名称'是不是一个函数,得到了未定义错误。我的JavaScript包括含有控制器和工厂(如提及)与渲染图的指示沿角模块。
我的JavaScript是:
VAR应用= angular.module(图表,[]);app.directive('highchart',函数(){
返回{
限制:'E',
模板:'< DIV>< / DIV>,
更换:真实,
链接:功能(范围,元素,ATTRS){
范围。$表(函数(){
返回attrs.chart;
},函数(){
如果回报(attrs.chart!);
VAR图表= JSON.parse(attrs.chart);
$(元素[0])highcharts(图表)。
});
}
};
});app.factory('GetOverSpeedWorstData',函数($范围,$ HTTP){
$ http.get(的http://本地主机:5155 / overspeedworst / OverSpeedworst').success(功能(数据,状态){
$ scope.score = [];
对于(VAR I = 0; I< data.length;我++){
score.push(数据[I] .Score);
}
$ scope.name = [];
对于(VAR I = 0; I< data.length;我++){
name.push(数据[I] .Name点);
}
})错误(错误消息);
$超时($ scope.fetch,1000);
});app.controller(Ctrl键,功能($范围,GetOverSpeedWorstData){
$ scope.name = GetOverSpeedWorstData.name;
$ scope.score = GetOverSpeedWorstData.score;
$ scope.renderChart = {
图:{
类型:'棒'
},
X轴:{
类别:名称
},
系列:[{
数据:得分
}],
传说:{
启用:假的
}
};
});
和我的HTML是:
<!DOCTYPE>
< HTML的xmlns =http://www.w3.org/1999/xhtml>
< HEAD>
<标题>仪表盘应用与LT; /标题>
&所述; SCRIPT SRC =http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js>&下; /脚本>
&所述; SCRIPT SRC =http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js>&下; /脚本>
&所述; SCRIPT SRC =HTTP://$c$c.highcharts.com/highcharts.js>&下; /脚本>
<脚本类型=文/ JavaScript的SRC =脚本/ OverSpeedWorstDataServiceApp.js>< / SCRIPT>
<脚本类型=文/ JavaScript的SRC =脚本/ DashboardCtrl.js>< / SCRIPT>
<链接rel =stylesheet属性类型=文/ CSS的href =Dashboard.css>
< /头>
<身体GT;
<表>
&所述; TR>
&所述; TD>
< H2>超速(最差)比分< / H>
<节NG-应用=OverSpeedWorstDataServiceApp>
< DIV NG控制器=GetOverSpeedWorstData>
< highchart图='{{renderChart}}'>< / highchart>
< / DIV>
< /节>
< / TD>
&所述; TD>
< H2>超速(最佳)比分< / H>
< / TD>
< / TR>
&所述; TR>
&所述; TD>
< H2>车辆里程< / H>
< / TD>
&所述; TD>
< H2>维修报告< / H>
< / TD>
< / TR>
< /表>
< /身体GT;
< / HTML>
这是为什么会这样有什么建议?此外,如果我检索控制器内的数据(相关code粘贴以及)这个运行完美。
VAR应用= angular.module(图表,[]);app.directive('highchart',函数(){
返回{
限制:'E',
模板:'< DIV>< / DIV>,
更换:真实,
链接:功能(范围,元素,ATTRS){
范围。$表(函数(){
返回attrs.chart;
},函数(){
如果回报(attrs.chart!);
VAR图表= JSON.parse(attrs.chart);
$(元素[0])highcharts(图表)。
});
}
};
});app.controller(Ctrl键,功能($范围,$ HTTP,$超时){
$ http.get(的http://本地主机:5155 / overspeedworst / OverSpeedworst').success(功能(数据,状态){
变种评分= [];
对于(VAR I = 0; I< data.length;我++){
score.push(数据[I] .Score);
}
变量名称= [];
对于(VAR I = 0; I< data.length;我++){
name.push(数据[I] .Name点);
}
$ scope.renderChart = {
图:{
类型:'棒'
},
X轴:{
类别:名称
},
系列:[{
数据:得分
}],
传说:{
启用:假的
}
};
})错误(错误消息);
$超时($ scope.fetch,1000);
});
要添加更多的,我的JSON数据的格式为:
[{
名称:A,
得分:900
},{
名称:B
得分:846
},{
名称:C,
得分:757
},{
名称:D,
得分:321
},{
名称:E,
得分:222
}]
您的问题不是控制器,但你定义服务的方式,用一个工厂:<一href=\"http://stackoverflow.com/questions/17550895/angularjs-declaring-factory-with-a-single-object-with-a-nested-array-getting/17551246#17551246\">Angularjs - 工厂声明与一个嵌套数组单个对象 - 获得的ReferenceError:......是不是
定义您或许应该做一些这样的:
app.factory('GetOverSpeedWorstData',函数($范围,$ HTTP){
VAR - [R;
$ http.get(的http://本地主机:5155 / overspeedworst / OverSpeedworst').success(功能(数据,状态){
的东西,如R =数据
})错误(错误消息);
错误的东西
}); 返回{这里服务的方法};
否则你的工厂没有任何保理。它返回的东西。
I am trying to retrieve json data through an angular factory function and feeding the data to a controller to create a chart (highchart) object. However, this gives me a "Argument 'Factory Function Name' is not a function, got undefined" error. My javascript contains an angular module containing a controller and factory (as mentioned) along with a directive which renders the chart.
My javascript is:
var app = angular.module('charts', []);
app.directive('highchart', function () {
return {
restrict: 'E',
template: '<div></div>',
replace: true,
link: function (scope, element, attrs) {
scope.$watch(function () {
return attrs.chart;
}, function () {
if (!attrs.chart) return;
var charts = JSON.parse(attrs.chart);
$(element[0]).highcharts(charts);
});
}
};
});
app.factory('GetOverSpeedWorstData', function ($scope, $http) {
$http.get('http://localhost:5155/overspeedworst/OverSpeedworst').success(function (data, status) {
$scope.score = [];
for (var i = 0; i < data.length; i++) {
score.push(data[i].Score);
}
$scope.name = [];
for (var i = 0; i < data.length; i++) {
name.push(data[i].Name);
}
}).error("error message");
$timeout($scope.fetch, 1000);
});
app.controller('Ctrl', function ($scope, GetOverSpeedWorstData) {
$scope.name = GetOverSpeedWorstData.name;
$scope.score = GetOverSpeedWorstData.score;
$scope.renderChart = {
chart: {
type: 'bar'
},
xAxis: {
categories: name
},
series: [{
data: score
}],
legend: {
enabled: false
}
};
});
and my HTML is:
<!DOCTYPE>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Dashboard Application</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script type="text/javascript" src="Scripts/OverSpeedWorstDataServiceApp.js"></script>
<script type="text/javascript" src="Scripts/DashboardCtrl.js"></script>
<link rel="stylesheet" type="text/css" href="Dashboard.css">
</head>
<body>
<table>
<tr>
<td>
<h2>Overspeed (Worst) Scores</h2>
<section ng-app="OverSpeedWorstDataServiceApp">
<div ng-controller="GetOverSpeedWorstData">
<highchart chart='{{renderChart}}'></highchart>
</div>
</section>
</td>
<td>
<h2>Overspeed (Best) Scores</h2>
</td>
</tr>
<tr>
<td>
<h2>Vehicle Mileage</h2>
</td>
<td>
<h2>Servicing Report</h2>
</td>
</tr>
</table>
</body>
</html>
Any advice on why is this happening? Moreover, this runs perfectly if I retrieve the data within the controller (the related code is pasted as well).
var app = angular.module('charts', []);
app.directive('highchart', function () {
return {
restrict: 'E',
template: '<div></div>',
replace: true,
link: function (scope, element, attrs) {
scope.$watch(function () {
return attrs.chart;
}, function () {
if (!attrs.chart) return;
var charts = JSON.parse(attrs.chart);
$(element[0]).highcharts(charts);
});
}
};
});
app.controller('Ctrl', function ($scope, $http, $timeout) {
$http.get('http://localhost:5155/overspeedworst/OverSpeedworst').success(function (data, status) {
var score = [];
for (var i = 0; i < data.length; i++) {
score.push(data[i].Score);
}
var name = [];
for (var i = 0; i < data.length; i++) {
name.push(data[i].Name);
}
$scope.renderChart = {
chart: {
type: 'bar'
},
xAxis: {
categories: name
},
series: [{
data: score
}],
legend: {
enabled: false
}
};
}).error("error message");
$timeout($scope.fetch, 1000);
});
To add more, my json data is of the form:
[{
"Name": "A",
"Score": 900
}, {
"Name": "B",
"Score": 846
}, {
"Name": "C",
"Score": 757
}, {
"Name": "D",
"Score": 321
}, {
"Name": "E",
"Score": 222
}]
Your problem is not the controller but the way you define the service, with a factory: Angularjs - Declaring factory with a single object with a nested array - getting ReferenceError: .... is not defined
You should probably be doing something like:
app.factory('GetOverSpeedWorstData', function ($scope,$http) {
var r;
$http.get('http://localhost:5155/overspeedworst/OverSpeedworst').success(function (data, status) {
stuff, like r = data
}).error("error message");
error stuff
});
return {service methods here};
otherwise your factory is not factoring anything. it has to return something.
这篇关于通过角工厂数据馈送到控制器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!