AngularJS: ng-repeat для нескольких делителей - PullRequest
0 голосов
/ 26 мая 2018

Я бы хотел, чтобы часть моего сайта представляла собой коллаж из изображений и информации, как показано ниже:

My aim

Я могу сделать это вручную каксерия div:

<div class="options">
    <div class="option">
        <a href="https://www.handpickedhotels.co.uk/bailbrookhouse"><img class="opt_img" src="images/hotels/BBH.jpg"></a>
        <h3 class="centered" id="hotel_info">Bailbrook House Hotel<br>BA1 7JD<br>Approx Price: &pound;xx</h3>
    </div>
    <div class="option">
        <a href="https://www.travelodge.co.uk/hotels/75/Bath-Central-hotel"><img class="opt_img" src="images/hotels/bath_central_travelodge.jpg"></a>
        <h3 class="centered" id="hotel_info">Bath Central Travelodge<br>BA1 2EB<br>Approx Price: &pound;xx </h3>
    </div>
    <div class="option">
        <a href="https://www.travelodge.co.uk/hotels/361/Bath-Waterside-hotel"><img class="opt_img" src="images/hotels/bath_waterside_travelodge.jpg"></a>
        <h3 class="centered" id="hotel_info">Bath Waterside Travelodge<br>BA2 4JP<br>Approx Price: &pound;xx</h3>
    </div>
</div>
<div class="options">
    <div class="option">
        <a href="https://www.premierinn.com/gb/en/hotels/england/somerset/bath/bath-city-centre.html"><img class="opt_img" src="images/hotels/Bath_premier_inn.jpg"></a>
        <h3 class="centered" id="hotel_info">Bath City Centre Premier Inn<br>BA1 2BX<br>Approx Price: &pound;xx</h3>
    </div>
    <div class="option">
        <a href="https://www.yha.org.uk/hostel/yha-bath"><img class="opt_img" src="images/hotels/YHA.jpg"></a>
        <h3 class="centered" id="hotel_info">YHA Bath<br>BA2 6LA <br>Approx Price: &pound;xx </h3>
    </div>
    <div class="option">
        <a href="https://www.bailbrooklodge.co.uk/"><img class="opt_img" src="images/hotels/bailbrook_lodge.jpg"></a>
        <h3 class="centered" id="hotel_info">Bailbrook Lodge<br>BA1 7HZ<br>Approx Price: &pound;xx</h3>
    </div>

и следующий CSS:

*{
    font-family: "Palatino Linotype", "Book Antiqua", Palatino, serif
}

#hotel_info{
    background-color: rgba(130, 130, 130,0.7);
    width: 80%;
}

.centered {
    position: absolute;
    width: 100%;
    top: 40%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.options{
    width: 100%;
    overflow: hidden;
}

.option {
    position: relative;
    text-align: center;
    width: 33%;
    float:left;
}

.opt_img{
    width: 100%;
    opacity: 0.7;
}

Я начал играть в AngularJS, чтобы упростить отображение этой информации,

У меня есть MainController.js

app.controller('MainController', function($scope){
    $scope.title = 'Hotels';
    $scope.hotels = [
        {
            name: 'Bailbrook House Hotel',
            postcode: "BA1 7JD",
            price: 0.00,
            website: "https://www.handpickedhotels.co.uk/bailbrookhouse",
            img: "images/hotels/BBH.jpg"
        },
        {
            name: "Bath Central Travelodge",
            postcode: "BA1 2EB",
            price: 0.00,
            website: "https://www.travelodge.co.uk/hotels/75/Bath-Central-hotel",
            img: "images/hotels/bath_central_travelodge.jpg"
        },
        {
            name: "Bath Waterside Travelodge",
            postcode: "BA2 4JP",
            price: 0.00,
            website: "https://www.travelodge.co.uk/hotels/361/Bath-Waterside-hotel",
            img: "images/hotels/bath_waterside_travelodge.jpg"
        },
        //... [and so on]
    ]
});

Затем я использовал

<div ng-controller="MainController">
    <div class = "options" ng-repeat="hotel in hotels">
        <div class = "option">
            <a ng-href={{hotel.website}}><img class="opt_img" ng-src={{hotel.img}}></a>
            <h3 class="centered" id="hotel_info">{{hotel.name}}<br>{{hotel.postcode | uppercase}}<br>Approx Price: {{hotel.price | currency:'&pound;'}}</h3>
        </div>
    </div>
</div>

Это помещает все опции друг под другом.Я могу понять, почему это так, поскольку он не создает опции div для каждого набора из 3, как я делал, когда делал это вручную.Можно ли добиться этого с помощью ng-repeat или мне нужно переосмыслить то, как я это делаю?


Я очень новичок в веб-разработке, поэтому, пожалуйста, сделайте ваши ответы начинающими дружественными и терпитеменя, если я должен попросить разъяснений.Я также открыт для людей, предлагающих лучший или более простой способ ведения дел, я просто использовал курс AngularJS Codecademy в качестве отправной точки.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Этого легко достичь, используя свойство css flex

<div ng-controller="MainController" class="hotel-container">
    <div class = "options" ng-repeat="hotel in hotels">
        <div class = "option">
            <a ng-href={{hotel.website}}><img class="opt_img" ng-src={{hotel.img}}></a>
            <h3 class="centered" id="hotel_info">{{hotel.name}}<br>{{hotel.postcode | uppercase}}<br>Approx Price: {{hotel.price | currency:'&pound;'}}</h3>
        </div>
    </div>
</div> 

.hotel-container {
   display: flex;
}
.options {
  width : 33.33%;
}

Подробнее о свойствах flex здесь: https://css -tricks.com / almanac / properties / f / flex /

0 голосов
/ 26 мая 2018

Решение JS

Действительно простое решение - сгруппировать ваш список в подсписки из 3 элементов:

 $scope.hotels = [
    [{
      name: 'Bailbrook House Hotel',
      postcode: "BA1 7JD",
      price: 0.00,
      website: "https://www.handpickedhotels.co.uk/bailbrookhouse",
      img: "images/hotels/BBH.jpg"
    }, {
      name: "Bath Central Travelodge",
      postcode: "BA1 2EB",
      price: 0.00,
      website: "https://www.travelodge.co.uk/hotels/75/Bath-Central-hotel",
      img: "images/hotels/bath_central_travelodge.jpg"
    }, {
      name: "Bath Waterside Travelodge",
      postcode: "BA2 4JP",
      price: 0.00,
      website: "https://www.travelodge.co.uk/hotels/361/Bath-Waterside-hotel",
      img: "images/hotels/bath_waterside_travelodge.jpg"
    }],
    //...
  ]

, а затем просто добавить еще один ng-repeatдиректива

<div ng-controller="MainController">
  <div ng-repeat="group in hotels">
    <div class = "options" ng-repeat="hotel in group">
      <div class = "option">
        <a ng-href={{hotel.website}}><img class="opt_img" ng-src={{hotel.img}}></a>
        <h3 class="centered" id="hotel_info">{{hotel.name}}<br>{{hotel.postcode | uppercase}}<br>Approx Price: {{hotel.price | currency:'&pound;'}}</h3>
      </div>
    </div>
  </div>
</div>

CSS-решение

Еще одно простое решение с использованием CSS - это использование flex-direction: row, а затем соответственно установить свойство flex для элементов,Вот кодовое перо с использованием библиотеки начальной загрузки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...