Skip to content Skip to sidebar Skip to footer

Angular Ngrepeat - Update After Html Changed

I have a problem which I can't seem to get around. I have a simple angular repeat setup to output some slides. There are different sets of slides which can be changed. I'm using a

Solution 1:

I created a pagination script inside your directive that will show only the slides that are contained within your current_listing.slides object property value. I removed the ng-repeat directive from your html because it was adding four more slides to the dom each time you clicked on a listing button. I also moved your {{ scope variable here }} code from your html and placed the variables inside of ng-bind directives so that the brackets are not displayed on the screen before angular compiles. I also added an ng-click directive to your listing buttons that pass an integer value to the controller that sets the current_listing value.

Live Example: http://codepen.io/larryjoelane/pen/ZWzObo

HTML:

<divng-app="myApp"ng-controller="MyCtrl">
  Listing Id: <spanng-bind="current_listing.id"></span><divrepeat-endclass="image_slider col-md-9"><divng-bind="slides"class="slick"></div></div><buttonng-click="changeListing(1)">Listing 1</button><buttonng-click="changeListing(2)">Listing 2</button></div>

Angular/JQuery:

(function($) {

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

  myApp.directive("repeatEnd", function($timeout) {
    return {
      restrict: "A",
      link: function(scope, element, attrs) { //begin link//let angular compile first then call the jquery code$timeout(function() { //begin timeoutfunctionbuildSlides() {

              //array to hold the slidesvar slides = [];

              //loop through and the opening and closing div tags to the slidesfor (var i = 0; i < scope.current_listing.slides.length; i++) { //begin for//add the slide
                slides.push("<div>" + scope.current_listing.slides[i] + "</div>");

              } //end for//return the slides htmlreturn slides.join("");

            } //end function          //initalize slick slider
            $(element).slick(scope.$eval());

            //check for changes in the listing
            scope.$watch('current_listing', function(newValue, oldValue) { //begin watch//if there is a new valueif (newValue) {

                //destroy the slick slider
                $(element).slick("unslick");

                //store the htmlvar content = buildSlides();

                //populate the slides
                scope.slides = scope.$eval(element.html(content));

                //reinitalize slick slider 
                $(element).slick();

              }
            }); //end watch

          }); //end timeout

        } //end link

    };
  });

  myApp.controller("MyCtrl", ["$scope", "$timeout", function($scope, $timeout) {

    $scope.listing = {
      id: 1,
      slides: ['Slide 1', 'Slide 2', 'Slide 3', 'Slide 4']
    };

    $scope.listing2 = {
      id: 2,
      slides: ['Slide 5', 'Slide 6', 'Slide 7', 'Slide 8']
    };

    //intialize the listing$scope.current_listing = $scope.listing;

    //change the listing on click$scope.changeListing = function(listNum) { //begin function//Assign the listings based on the listNum//passed in as a parameter.if (listNum === 1) {
          $scope.current_listing = $scope.listing;
        } elseif (listNum === 2) {
          $scope.current_listing = $scope.listing2;
        }

      } //end function

  }]);

})(jQuery);

Post a Comment for "Angular Ngrepeat - Update After Html Changed"