从 .csv 文件读入的内容有时不会在页面加载时显示

Content read in from a .csv file occasionally not showing up on page load

所以我正在为自己制作个人作品集,其中包括一些我为我的入门级网络开发人员所做的项目 class。由于我们一直在 class 实践数据驱动的内容网站和网络应用程序,我的教授希望我们做类似的事情,将我们的数据放在基于云的数据存储或 .csv 文件中。我决定采用 .csv 文件路径。

创建 .csv 文件后,我使用 Papa Parse 将 .csv 文件数据读入我的网站可用的格式,然后我使用 angular 循环访问数据并将相关部分放在页面上。我网站上唯一使用此数据的部分是主页上的项目部分。

无论如何,我的问题是有时当我加载页面时,无论是第一次打开 URL,还是从关于或联系页面切换到主页时,我注意到内容没有显示,我必须重新加载页面才能显示 gif 和文本。以下是一些屏幕截图:What it should look like and What it sometimes looks like。如果你想亲眼看看。 (它仍在进行中,所以我承认我对 post 有点尴尬,但我真的很想解决这个问题)。

此外,这里是 HTML 页面使用此数据的位置:

<div class="projects">
<h1 class="projects-heading">Projects</h1>
<div class="container projectContainer" ng-repeat="project in projects">
    <div class="row">
        <div class="col-xs-12 col-md-6">
            <img class="projectGif" ng-src="{{project.gifUrl}}" ng-hide="projects.length < 0">
        </div>
        <div class="col-xs-12 col-md-6">
            <h4 class="project-info proj-title">{{project.title}}</h4>
            <p class="project-info proj-body">{{project.description}}</p>
            <a class="project-info" target="_blank" href="{{project.link}}">View the live site</a>
        </div>
    </div>
    <!-- Creates divier line between each separate project -->
    <hr class="project-split">
</div>

我的控制器:

app.controller('HomeController', function($scope){
Papa.parse("data/home.csv", {
    download: true,
    header: true,
    complete: function(results) {
        $scope.projects = results.data;
    }
});

});

我不认识这个爸爸,但我认为这是一个异步调用,因此它 运行 在 Angular 循环之外。试试这个

complete: function(results) {
    $scope.projects = results.data;
    $scope.$apply();
}

Angular 有自己的事件循环 运行 每次 Angular 知道它必须 运行。当在 Angular 内修改状态 运行s 的代码时,就会发生这种情况。 当循环 运行s 时,所有变量、绑定和渲染也被更新。

这里您使用的是外部库 Papa,它只是 运行 一个 Ajax 请求。请求在 Angular 内发送,但由于异步,结果回调在外部处理。因此,您必须强制 Angular 更新其数据。 $scope.$apply() 的作用是强制事件循环只为这个控制器更新。

每次 运行 不在 Angular 内但会与 Angular 交互的代码时,请记住这样做。这对于 'onclick' 或 jQuery 事件或 Angular 范围之外的任何代码都是有效的。

我在 angular 8 中遇到了类似的问题,@simone 的回答给了我一个解决它的想法。

这里是angular 8

中用来求解的代码
public parseCSV(file: File) {
    let _self = this;
    Papa.parse(file, {
      error: function (err, file, inputElem, reason) {
        console.log(err);
      },
      complete: function (results) {
        _self.apply(results.data);
        console.log("Finished:", results.data);
      }
    });
  }

public apply(data) {
    this.dataSource = data;
  }