Обновить список в ng-repeat без функции onclick

0

Привет, я пытаюсь отобразить данные с сервера в приложении Angularjs, где я получил данные и использую ng-repeat, чтобы отобразить его через контроллер.

Вот как выглядит мой контроллер:

module.controller('FiveReasons', function($scope, $http, $rootScope, $sce) {
ons.ready(function() {
                    $scope.reasonsLists = {};
                   var reasonsListing = $http.get("http://vbought.com/design_14/index.php/design_ci/post/Clients");
                    reasonsListing.success(function(data, status, headers, config) {
                        console.log(data[0].post_title);
                        $scope.reasonsLists = data;
                        $scope.spinner = false;
                    });
                    reasonsListing.error(function(data, status, headers, config) {

                        alert("Can Not load the address Ajax");
                    });   
    });
});

Но когда ng-repeat заканчивает загрузку, данные не отображаются.

Вот как мой ng-repeat:

  <ons-carousel swipeable overscrollable auto-scroll fullscreen var="carousel" name="FiveRes" class="FiveRes">

        <div ng-repeat="reasonsList in reasonsLists">

          <ons-carousel-item style="background: #09a4c0;" >
            <div class="item-label">Number : {{reasonsList}}</div>

          </ons-carousel-item>

        </div>


          <ons-carousel-cover></ons-carousel-cover>
        </ons-carousel>

Как я могу обновить список, как только данные будут там. Как и мы, "триггер (" обновить ")" в jquery.

После запуска ng-repeat это так, как я получаю значение, но экран пуст.

Изображение 174551

Спасибо! (Заранее)

  • 0
    Вы уверены, что событие ons.ready действительно происходит? Angular использует привязку данных, поэтому каждый раз, когда вы обновляете что-то в контроллере, оно должно обновляться в dom. Я думаю, что с угловым сервисом $ http вам не нужно использовать $ scope. $ Apply (); чтобы получить какие-либо изменения, но я могу ошибаться.
  • 0
    Да, это увольнение. Я сделал console.log на этом
Показать ещё 3 комментария
Теги:
onsen-ui

3 ответа

1

Попробуй это:

module.controller('FiveReasons', function($scope, $http, $rootScope, $sce) {
       ons.ready(function() {
           $scope.reasonsLists = {};
           var reasonsListing = $http.get("http://vbought.com/design_14/index.php/design_ci/post/Clients");
           reasonsListing.success(function(data, status, headers, config) {
                 console.log(data[0].post_title);
                 $scope.reasonsLists = data;
                 $scope.spinner = false;
           });
           reasonsListing.error(function(data, status, headers, config) {
                 alert("Can Not load the address Ajax");
           }); 
           //ADD this to notify Angular for the changes and run a digest cycle
           $scope.$digest();  
      });
});

Это происходит потому, что обработчик события (ons-ready) не запускает новый цикл $digest.

Чтобы отобразить данные без вызова $digest(), удалите обратный вызов ons-ready и выполните ваш код непосредственно в теле контроллера. Как пример ниже:

module.controller('FiveReasons', function($scope, $http, $rootScope, $sce) {
       $scope.reasonsLists = {};
       var reasonsListing = $http.get("http://vbought.com/design_14/index.php/design_ci/post/Clients");
       reasonsListing.success(function(data, status, headers, config) {
             console.log(data[0].post_title);
             $scope.reasonsLists = data;
             $scope.spinner = false;
       });
       reasonsListing.error(function(data, status, headers, config) {
             alert("Can Not load the address Ajax");
       }); 
       //No need to call $digest
});

ОБНОВЛЕНИЕ. Проверьте этот код, который является упрощенной версией вашего кода, который показывает только проблему. Удалите $scope.$digest() из комментариев, чтобы увидеть работу carousel.

1

Я думаю, что в этом случае я бы исключил использование готового кода и вызвал ваш код с помощью ng-init.

module.controller('FiveReasons', function($scope, $http) {
this.reasonsLists = {};
$scope.getReasonsLists = function() {
    $scope.reasonsLists = {};
    $http.get("http://vbought.com/design_14/index.php/design_ci/post/Clients")
        .success(function(data, status, headers, config) {
            console.log(data[0].post_title);
            $scope.reasonsLists = data;
            $scope.spinner = false;
        })
        .error(function(data, status, headers, config) {
            alert("Can Not load the address Ajax");
        });
};

});

то в вашем html на теге таблицы просто добавьте ng-init = "getReasonsLists()"

  • 0
    скопируйте фрагмент кода из вопроса, а не из моего ответа.
0

"Обновление" не должно быть необходимым, поскольку угловой использует другой подход. После определенных событий, таких как "щелчок" или возврат $ http-prom, угловые проходят через переменные с привязкой и проверяют, были ли они изменены, и если это так - изменяет DOM.

В вашем случае я думаю, что обещание возвращается, прежде чем вы добавляете успешный обратный вызов. Попробуйте связать его так:

$http.get("http://vbought.com/design_14/index.php/design_ci/post/Clients").success(function(data, status, headers, config) {
    console.log(data[0].post_title);
    $scope.reasonsLists = data;
    $scope.spinner = false;
}).error(function(data, status, headers, config) {
    alert("Can Not load the address Ajax");
}); 

В других случаях вы можете использовать $ scope. $ Apply(), но я думаю, это должно сказать вам, что вы не можете вложить $ digests, так как после $ http-request должен произойти один.

  • 0
    Да, я пытался. Но да, я думаю, что <ons-carousel> работает до того, как $ http-обещание завершится. Еще есть вопрос сохранения. Контент не отображается.
  • 0
    Как насчет попытки обернуть все внутри on.ready в setTimeout?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню