Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
117
rated 0 times [  118] [ 1]  / answers: 1 / hits: 17008  / 10 Years ago, fri, june 6, 2014, 12:00:00

So I'm trying to create a basic angular application that parses some CSV input, and fills a table with the parsed data.



You can see a plunker of what I'm trying to achieve here - http://plnkr.co/edit/6QFT4AcV4KpiSG23EdOS



Basically - as you can see - I have a <textarea> where the user will paste in some CSV, and the table below should then be filled with the data.



<div class=excelArea>
<textarea name=excelData ng-model=excelData></textarea>
</div>


This is the javascript I have so far, but I'm struggling with a few things
1. Seperating the email from the name
2. Pushing the data back into the $scope.inviteList;



app.controller(InviteController, function($scope) {

//Initliase objects
$scope.excelData = ;
$scope.errorMessage = ;
$scope.inviteList = [];

$scope.$watch(excelData, function() {

var lines, lineNumber, data, length;

lines = $scope.excelData.match(/[^rn]+/g);
lineNumber = 0;

for (var i = lines.length - 1; i >= 0; i--) {

l = lines[i];
lineNumber++;
data = l.split(/t/);

var email = ? ? ?
var name = ? ? ?

$scope.inviteList.push({
name: name,
email: email,
status: not sent
});

};

});

});


Some basic information:



The CSV will be two columns (name, email) and will look like this:



John Thompson,[email protected]
Robin Peters, [email protected]
Bill Bob, [email protected]

More From » angularjs

 Answers
4

Many problems in your code :




  • You could juste use split on your input instead of regexes, it makes everything easier

  • Your HTML isn't valid td should be inside tr and not the other way around

  • Your array was never cleared

  • Your bindings inside ng-repeat didn't use variable i defined here : i in inviteList

  • You should avoid unscoped variables (without var keyword) whenever possible



Otherwise, when you split a string, just access the splitted elements through their index.



Corrected code :



JS



$scope.$watch(excelData, function() {
var lines, lineNumber, data, length;
$scope.inviteList = [];
lines = $scope.excelData.split('n');
lineNumber = 0;
for (var i = lines.length - 1; i >= 0; i--) {
l = lines[i];

lineNumber++;
data = l.split(',');

var name = data[0];
var email = data[1];

$scope.inviteList.push({
name: name,
email: email,
status: not sent
});
}
});


HTML



  <table>
<tr>
<th>Name</th>
<th>Email</th>
<th>Status</th>
</tr>
<tr ng-repeat=i in inviteList>
<td>{{i.name}}</td>
<td>{{i.email}}</td>
<td>{{i.status}}</td>
</tr>
</table>


Your code (especially JS) can still be improved a lot and i encourage you to read docs/tutorials more.



And here is the plunker to your working code.


[#70684] Thursday, June 5, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
kinsley

Total Points: 352
Total Questions: 84
Total Answers: 94

Location: Denmark
Member since Tue, Jul 19, 2022
2 Years ago
;