#angularjs #function #wait #var
#angularjs #функция #подожди #var
Вопрос:
Есть функция, которая преобразует *.csv-файл в JSON. В функции я могу распечатать этот JSON на консоль.log console.log(jsonner); но я не могу передать его в Angular controller. $scope.names = jsonner; У меня есть 2 проблемы: как функция ожидания и как сделать var jsonner глобальным.
function csvJSON(csv){
var lines=csv.split("n");
var result = [];
var headers=lines[0].split(",");
for(var i=1;i<lines.length;i ){
var obj = {};
var currentline=lines[i].split(",");
for(var j=0;j<headers.length;j ){
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
//return resu< //JavaScript object
return JSON.stringify(result); //JSON
}
function processFiles(files) {
var file = files[0];
var reader = new FileReader();
reader.onload = function (e) {
// Когда это событие активируется, данные готовы.
// Вставляем их в страницу в элемент <div>
var output = document.getElementById("fileOutput");
output.textContent = e.target.result;
content = output.textContent;
jsonner = csvJSON(content);
console.log(jsonner);
};
reader.readAsText(file);
}
var SearchApp = angular.module('SearchApp',[]);
SearchApp.controller('ctrl2', ['$scope', function($scope){
// Here the array would be your response.text:
$scope.names = jsonner;
}]);
Комментарии:
1. Object.assign(global, jsonner); это создаст глобальный jsonner и будет использовать его как global.jsonner в контроллере ur
2. Ошибка неперехваченной ссылки: jsonner не определен
3. куда я должен ее поместить?
4. в функции ur назначьте результат следующим образом global.jsonner = jsonner; и используйте в угловом контроллере global.jsonner
5. игнорирование 1-го комментария
Ответ №1:
Вы $scope.names
указываете на оригинал jsonner
в памяти. Вы создаете новый объект с jsonner = csvJSON(content);
помощью, потому что он возвращает result
массив. Вам придется изменить исходный массив, чтобы он обновлялся так, как вы хотите.
Вот демонстрация рабочей логики, чтобы вы начали: Демонстрация Plunker
К сожалению file
, входные данные не работают ng-change
, однако есть пара обходных путей. Вы можете сделать это:
<input id="fileInput" type="file" ng-model="files" onchange="angular.element(this).scope().processFiles(this)">
или вы можете подключить событие, используя element.on('change', processFiles)
внутри пользовательской директивы. Вот что я сделал:
<body ng-controller="ctrl2">
<input id="fileInput" type="file" ng-model="files" onchange="angular.element(this).scope().processFiles(this)">
<div>{{ output }}</div>
<div ng-repeat="todo in names track by $index" class="repeat">
<div class="comname">{{todo.Name}}</div>
<div class="price">{{todo.Price}}</div>
<div class="change">{{todo.Change}}</div>
</div>
</body>
и логика:
var SearchApp = angular.module('SearchApp', []);
SearchApp.controller('ctrl2', ['$scope', function ($scope) {
$scope.processFiles = function (element) {
var file = element.files[0];
var reader = new FileReader();
reader.onload = function (e) {
// Need to notify angular of this event using $apply
$scope.$apply(function() {
// Когда это событие активируется, данные готовы.
// Вставляем их в страницу в элемент <div>
var output = document.getElementById("fileOutput");
$scope.output = e.target.resu<
jsonner = csvJSON(e.target.result);
console.log(jsonner);
$scope.names = jsonner;
});
};
reader.readAsText(file);
};
}]);
Комментарии:
1. Где вызываются эти функции?
2. <body ng-controller=»ctrl2″> <идентификатор ввода=»fileInput» тип=»file» onchange=»processFiles(это. файлы)»> <идентификатор div=»fileOutput»></div> <div ng-repeat=»задачи в именах» class=»repeat»> <div class=»comname»>{{todo.Name }}</div> <класс div=»цена»>{{задачи. Цена}}</div> <div class=»изменить»>{{задача. Изменить}}</div> </div> </body>
3. Итак, эти функции вызываются в javascript за пределами angularjs. если вы использовали ng-change, то вы могли бы изменить строку на
$scope.names = csvJSON(content);
и в вашем контроллере поместить$scope.processFiles = function(files){ ...}
4. Как я должен написать ng-change?
5.
<input id="fileInput" type="file" ng-change="processFiles(this.files)">
Возможно, вам придется обернуть логику внутриreader.onload = function (e) { }
с помощью a$scope.$apply()
, если$scope.names
она не обновляется.