2015-09-22 6 views
1

В настоящее время я работаю над некоторым кодом в Angular, который загружает список блог-страниц на веб-сайт. У меня есть модуль и контроллер, и у меня есть цикл ng-repeat, предназначенный для итерации через json, который действует как индекс для набора html-файлов. Однако теги, которые должны выводить данные из моего индексного объекта, на последней странице пустые.Контроллер AngularJS не отображает данные из массива

app.js:

var PersonalApp = angular.module('PersonalApp', [ 
    'ngRoute', 
    'MasterCtrl' 
]); 

PersonalApp.config(['$routeProvider', 
    function($routeProvider) { 
    $routeProvider. 
     when('/blog', { 
     templateUrl: 'partials/blog.html', 
     MasterCtrl: 'MasterCtrl' 

     }). 
     when('/about', { 
     templateUrl: 'partials/about.html', 
     MasterCtrl: 'MasterCtrl' 

     }). 
     when('/projects', { 
     templateUrl: 'partials/about.html', 
     MasterCtrl: 'MasterCtrl' 

     }). 
     when('/contact', { 
     templateUrl: 'partials/about.html', 
     MasterCtrl: 'MasterCtrl' 

     }). 
     otherwise({ 
     redirectTo: '/blog' 
     }); 
    }]); 

MasterCtrl.js:

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

MasterCtrl.controller('MasterCtrl', ['$scope', '$http', 
    function ($scope) { 
     $.ajax({ 
      url: '../BlogPosts/posts.json', 
      dataType: 'json', 
      success: function (bposts) { 
       $scope.bposts = (bposts); 
       bposts = JSON.stringify(bposts) 
       console.log(bposts); 
      } 
     }); 
    }]); 

blog.html:

<article ng-repeat="posts in bposts" class="post-173 post type-post status-publish format-standard has-post-thumbnail hentry category-uncategorized masonry-brick" style="position: absolute; left: 0px; top: 0px;"> 
       <div class="item-sizer"> 

        <header class="entry-header blog-entry-header"> 

         <div class="entry-data"> 
          <span class="posted-on"> 
           <a ng-href="/../BlogPosts/{{posts.ID}}" rel="bookmark"> 
            <time class="entry-date published updated" datetime="2015-08-20T02:48:02+00:00">{{posts.ID}}</time> 
           </a> 
          </span> 

         </div> 
         <h1 class="entry-title"><a ng-href="/../BlogPosts/{{posts.ID}}" rel="bookmark">{{posts.Title}}</a></h1> </header><!-- .entry-header --> 
         {[posts.ID}} 

        <div class="entry-content"> 
         <p>{{posts.Summary}}<a class="read-more" ng-href="/../BlogPosts/{{posts.ID}}">Continue reading</a></p> 
        </div><!-- .entry-content --> 
       </div> 
      </article> 

Вот консольный вывод из моего первоначально JQuery:

{"posts":[{ 
    "ID":"441770384", 
    "Title":"TestPost", 
    "Summary":"Doot Doot", 
    "Thumb":"null" 
},{ 
    "ID":"1441835958", 
    "Title":null, 
    "Summary":"null", 
    "Thumb":"‌​null" 
},{ 
    "ID":"1441836000", 
    "Title":null, 
    "Summary":"null", 
    "Thumb":"null" 
},{ 
    "ID":"14‌​41836039", 
    "Title":"dfasdf", 
    "Summary":"null", 
    "Thumb":"null" 
}]} 
+1

используйте '$ http' вместо' $ .ajax', поэтому вам не нужно использовать '$ apply()' для каждого запроса. Angular не знает о '$ .ajax', поэтому вам нужно сказать, чтобы он запускал дайджесты, когда вы меняете область видимости. – charlietfl

+0

Поздравляем с разделом вашего приложения в модулях, это редкий сайт на StackOverflow. Вам будет намного легче работать с – Phil

ответ

1

Вы, кажется, используете метод jQuery's .ajax вместо $http. Использование jQuery не приведет к циклу дайджеста и, таким образом, ваши изменения области не будут отражаться в ваших шаблонах. Используйте $http вместо ...

Просто измените "MasterCtrl" контроллер

.controller('MasterCtrl', ['$scope', '$http', 
    function ($scope, $http) { 
     $http.get('../BlogPosts/posts.json').then(function(response) { 
      $scope.bposts = response.data.posts; 
     }); 
    }]); 

и стараются избегать использования JQuery в угловых приложениях.

Дополнительную информацию о цикле дайджеста см. В $apply(), если вы настаиваете на использовании сторонних библиотек, таких как jQuery.

+0

У меня это было изначально, но оно тоже не работало. Просто попробовал свой код, и он не сработал. –

+0

@AdrianSmith * «не работает» * не очень хорошее описание проблемы. Как выглядят данные в 'posts.json'? – Phil

+0

Использование вашей версии кода не изменилось, как выглядит фактическая страница. Вот консольный вывод моего изначально jQuery: {"posts": [{"ID": "441770384", "Title": "TestPost", "Summary": "Doot Doot", "Thumb": "null "}, {" ID ":" 1441835958" , "Название": нулевой, "Резюме": "нуль", "Thumb": "нулевой"}, { "ID": "1441836000", "Название": нулевой, "Резюме": "нуль", "Thumb": "нулевой"}, { "ID": "1441836039", "Название": "dfasdf", "Резюме": "нуль", "Thumb": "нулевой"} ]} –

0

Поскольку вы извлекаете данные с помощью JQuery ($ .ajax), вы должны вызывать $ scope. $ Apply(), поэтому AngularJS может создать привязку и обновить ваше представление.

Вы можете проверить When to use $scope.$apply() для получения дополнительной информации.

+0

Где я могу это использовать? –

+0

Вы должны использовать это, после того как вы присвойте полученные данные переменной области видимости. В вашем случае это будет после ** $ scope.bposts = (bposts); ** – Romulo

+0

Я переключился на версию кода, отличную от jQuery, как предложено @Phil, но та же проблема все еще происходит. –

Смежные вопросы