【问题标题】:Accessing specific json data in AngularJS在 AngularJS 中访问特定的 json 数据
【发布时间】:2016-07-17 18:49:53
【问题描述】:

我有一个包含文章信息的 json 文件,其中每篇文章都有一个 ID。这是它的格式:

[{"title":"ISIS No. 2 killed in US special ops raid",
  "id":"14589192090024090",
  "agency":"foxnews",
  "text":"Article text goes here.",
  "topic":"Politics",
  "imagePath":"resources\/images\/foxnews\/14589192090024090.img.jpg"},
 {"title":", etc etc }]

在我的主页上,我有一个显示标题和作者的列表视图,当您单击文章时,我希望它显示文本、主题等。我用于请求 json 的 angularJS 工厂如下所示:

var trooNewsServices = angular.module('trooNewsServices', ['ngResource']);

  trooNewsServices.factory('Articles', ['$resource',
  function($resource){
    return $resource('resources/articles.json');
  }]);

我通过以下方式访问主页控制器中的完整文章列表:

this.articles = Articles.query();

我正在努力解决的是当我单击特定文章时,我希望下一页显示该文章信息。我试图通过使用 $routeParams.id 获取特定的 id,然后在 json 中查找 id 来做到这一点。这是我选择的文章控制器中的代码:

TrooNews.controller('ArticleController', ['$routeParams','Articles',
    function($routeParams, Articles) {

        //look through articles for specific article using routeparams
        Articles.query().$promise.then(function(articles) {

            for(i = 0; i < articles.length; i++){

                if(articles[i].id===$routeParams.id){
                    this.selectedArticle=articles[i];
                }

            }

        });

        console.log(selectedArticle);
}]);

我收到错误消息“无法实例化控制器 ArticleController”。如何在 promise 函数之外访问我的 selectedArticle 变量?

【问题讨论】:

  • 您的模块名称是 trooNewsServices。使用 trooNewsServices.controller('ArticleController', ['$routeParams','Articles', '$scope', function($routeParams, Articles, $scope) {.....})
  • 在单独的文件中的主 TrooNews 模块中,我将 trooNewsServices 作为项目的依赖项包含在内,因此这不应该是问题
  • 能否提供详细的代码。会给你 Plunker。
  • 检查更新的答案

标签: javascript angularjs json ngresource


【解决方案1】:
TrooNews.controller('ArticleController', ['$routeParams','Articles',
    function($routeParams, Articles) {
       var parent = this;
       parent.selectedArticle = null;
       parent.setSelectedArticle = function(article){
          parent.selectedArticle = article;
       }
       //look through articles for specific article using routeparams
       Articles.query().$promise.then(function(articles) {
          for(i = 0; i < articles.length; i++){
            if(articles[i].id===$routeParams.id){
                parent.setSelectedArticle(articles[i])
                break;
            }
        }
    }); 
}]);

【讨论】:

  • 这个选项似乎是一个很好的解决方案,但不幸的是,因为我在我的项目 $scope 中使用新的角度路由器不起作用,这就是我使用 .this 关键字的原因:( github.com/angular/ router/issues/313 我想知道是否有办法在范围内做到这一点
【解决方案2】:

您正在进行异步调用,因此不要指望在您调用它后立即显示结果。使用回调方法:

Articles.query().then(function(articles){

    for(i = 0; i < articles.length; i++){
        if(article[i].id===id){
            selectedArticle=article;
        }
    }

    console.log(selectedArticle);
})

或者您可以在回调调用中强制使用范围摘要。

【讨论】:

  • 我得到了这个 .then 函数,但现在我的 selectedArticle 变量不是全局变量,除了在那个 .then 函数内,我无法在任何地方访问它。我尽一切努力使变量成为全局变量,但我认为我遗漏了一些东西
  • 你可以把它变成一个作用域变量,比如$scope.selectedArticle = article;,如果你不需要,把var selectedArticle;放在我的sn-p上面。
  • 尝试了这两种方法,但它们都不起作用,这看起来很奇怪。而不是 Articles.query().then 我不得不使用 Articles.query().$promise.then,我想知道这是否与它有关。在函数(文章)之外我无法访问 selectedArticle,因此无法在我的 html 中访问它
  • 记录时数据是否正确?如果是这样,请在回调中强制范围摘要循环,如下所示:$scope.$apply();
  • 当我在函数中记录数据时数据是正确的,它给了我一个资源类型的对象。由于某种原因,范围对我不起作用。当我将它传递给我的控制器时,它会抛出一个错误(因为我使用 Angular 新路由器,我得到的只是'无法实例化控制器 ArticleController'。我将编辑上面的代码以向您展示我所拥有的!跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多