2014-02-18 3 views
0

Я пытаюсь получить данные из YELP - чтобы убедиться, что мой шаблон работает, я привязал модель к контейнеру ng-repeat. Оба метода не работают, что меня смущает, так это то, что я обновляю свой список с помощью $ scope.list, который содержит неверные данные и не связывает их. Используя некоторые из возвращаемых свойств API, также не обновляет представление. Есть предположения?Угловая модель данных с неправильными значениями

<div ng-repeat="item in list"> 
     <div class="row"> 
      <div class="col-lg-7 col-md-7"> 
       <a href="#"> 
        <img class="img-responsive" src="http://placehold.it/700x300" alt=""> 
       </a> 
      </div> 

      <div class="col-lg-5 col-md-5"> 
       <h3>{{item.id}}</h3> 
       <h4>Subheading</h4> 
       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam viverra euismod odio, gravida pellentesque urna varius vitae. Sed dui lorem, adipiscing in adipiscing et, interdum nec metus. Mauris ultricies, justo eu convallis placerat, felis enim.</p> 
       <a class="btn btn-primary" href="#">View Project <span class="glyphicon glyphicon-chevron-right"></span></a> 
      </div> 
     </div> 
    </div> 






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

blogAppViewController.controller('post_View_Ctrl', function ($scope, $http, $routeParams, $location) { 

    $scope.list = [ 
     {'title': 'Nexus S','name': 'Fast just got faster with Nexus S.','link':"data:wMB"}, 
     {'title': 'Nexus S','name': 'Fast just got faster with Nexus S.','link':"data:wMB"} 
    ]; 

    function getYELP() { 
     return $.ajax({ 
      url: '/getyelp' 
     }); 
    }; 
///// 
///// 
    $.when(getYELP()).done(function(results) { 
     this.yelp_Data = results.businesses; 
     $scope.list = this.yelp_Data; 
     console.log($scope.list); 
    }); 
}); 
+0

Что происходит, когда я удалить все $ scope.list ничего делает - когда он делает с неправильными входами, заполнители на самом деле там. Поэтому я не знаю, почему $ scope.list не возвращается с данными. Выполнение console.log показывает возвращенный фид JSON – seasick

+1

Возможно, вам придется встать на plunkr/fiddler. Вы пробовали $ scope.list = angular.copy (this.yelp_Data); В зависимости от того, на что вы действительно возвращаетесь, вам даже может понадобиться использовать $ scope.list = angular.copy (angular.fromJson (this.yelp_Data)); Также вы должны действительно использовать $ http часть от Angular. (это очень приятно!) –

+0

Да, Cory, я пробовал оба этих метода с тем же поведением. – seasick

ответ

1

Основная проблема, которую я вижу это вы используете запрос JQuery Ajax, который работает за пределами углового $digest цикла.

Поэтому, если вы хотите продолжить использование jQuery (хотя я предлагаю вам воспользоваться услугой $http), вам необходимо позвонить $apply() после изменения значений области, чтобы угловая структура узнала об изменениях.

$.when(getYELP()).done(function (results) { 
    this.yelp_Data = results.businesses; 
    $scope.list = this.yelp_Data; 
    console.log($scope.list); 
    if (!$scope.$$phase && !$scope.$root.$$phase) { 
     $scope.$apply(); 
    } 
}); 
+0

Проблема, с которой я столкнулся, заключалась в том, что у нас были проблемы с синхронизацией в $ http, и я не мог правильно использовать результаты - этот метод im 'sure is retriving данные - я просто не могу связать его? – seasick

+0

Это не имеет смысла - я получаю данные, я думаю, что они пытаются связать неправильный тип. Hwo я могу проверить объект - какие свойства он должен иметь? – seasick

+1

@ Исследуйте свою проблему http://jsfiddle.net/arunpjohny/h92VC/4/ soution http://jsfiddle.net/arunpjohny/h92VC/5/ –

1

(в серферском голосе) «Не сражайтесь с угловым».

Попробуйте положить свой вызов ajax в сервис, подобный этому.

Контроллер:

.controller('post_View_Ctrl', function ($scope, YelpService) { 
    $scope.list = [ 
     {'title': 'Nexus S','name': 'Fast just got faster with Nexus S.','link':"data:wMB"}, 
     {'title': 'Nexus S','name': 'Fast just got faster with Nexus S.','link':"data:wMB"} 
    ]; 
    $scope.init = function() { 
     function success(value) { 
      $scope.list = angular.copy(value.businesses); 
     } 
     function error(reason) { 
      console.log(reason); 
     } 
     YelpService.get().then(success, error); 
    }; 
    $scope.init(); 
}); 

Услуги:

.factory('YelpService', function($http, $q){ 
    return { 
     get: function() { 
      var deferred = $q.defer(); 
      $http.get('/getYelp') 
       .success(function (value) { 
        deferred.resolve(value); 
       }) 
       .error(function (reason) { 
        deferred.reject(reason); 
       }); 
      return deferred.promise; 
     } 
    }; 
}) 
+0

Мне нравится этот фрагмент кода - я считаю, что это помещает глобальный метод в моем контроллере? Если я хочу добавить другую функцию, я бы добавил к .factory}). вот так? – seasick

+0

Определенно. В идеале вы можете выявить/вернуть больше функций, чем просто «получить». Как «getBusinesses» или «getBusinessesByZipcode», что бы вы ни хотели. Кроме того, поскольку данные поступают с сервера, который вы не контролируете, вы можете перенести эту фабрику в другую, которая управляет структурой данных, чтобы лучше соответствовать вашим потребностям, а затем не манипулировать ею, прежде чем она отправит ее обратно на сервер. –

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