angularjs: arka plan resmi için ng-src eşdeğeri: url (…)


150

Angularjs size sahip etiket ng-src angularjs arasına yerleştirilen değişkenleri değerlendirmek bulmadan Geçersiz bir url için bir hata almazsınız bu amaca sahiptir {{ve }}.

Sorun, background-imagebir url kümesi ile oldukça bazı DIV kullanmaktır . Bunu background-size, görüntüyü DIV'nin tam boyutuna kesen mükemmel CSS3 özelliği nedeniyle yapıyorum .

Tek sorun, bir ng-src etiketi oluşturdukları tam olarak aynı nedenden dolayı çok fazla hata almasıdır: Url'de bazı değişkenler var ve tarayıcı görüntünün var olmadığını düşünüyor.

Ham yazı yazma olasılığının olduğunun farkındayım {{"style='background-image:url(myVariableUrl)'"}}, ama bu 'kirli' görünüyor.

Çok araştırdım ve bunu yapmanın doğru yolunu bulamıyorum. Uygulamam, tüm bu hatalar nedeniyle bir karmaşa haline geliyor.

Yanıtlar:


200

ngSrcyerel bir yönerge olduğundan, div'inizin background-imagestilini değiştiren benzer bir yönerge istediğiniz anlaşılıyor .

Tam olarak istediğinizi yapan kendi direktifinizi yazabilirsiniz. Örneğin

app.directive('backImg', function(){
    return function(scope, element, attrs){
        var url = attrs.backImg;
        element.css({
            'background-image': 'url(' + url +')',
            'background-size' : 'cover'
        });
    };
});​

Hangisini böyle çağırırsın

<div back-img="<some-image-url>" ></div>

Sevimli kedilerle bonus olarak JSFiddle: http://jsfiddle.net/jaimem/aSjwk/1/


67
Çok güzel bir direktif; tek sorun enterpolasyonu desteklememesidir. Muhtemelen bu şekilde değiştirirdim: jsfiddle.net/BinaryMuse/aSjwk/2
— Michelle Tilley

1
Teşekkür ederim, enterpolasyon olmadan olması önemli değil, yavru kedi var!
— Visgean Skeloru

Güvenilmeyen kaynaklardan yükleme yapıyorsanız bununla ilgili herhangi bir güvenlik sorunu var mı?
— Aakil Fernandes

Bu işe yarar, ancak yalnızca resim URL'niz zaten tanımlanmışsa, daha iyi gözlenebilir bir URL'ye sahip olmak için @ mythz answer stackoverflow.com/a/15537359/1479680 kullanın
— Magico

229

Bu benim için çalışıyor

<li ng-style="{'background-image':'url(/static/'+imgURL+')'}">...</li>

22
Bunun kabul edilen cevap olması gerektiğini düşünüyorum. Özel bir yönerge eklemenize gerek yoktur.
— Jakob Løkke Madsen

2
Ben sadece interpolasyon kullanarak, buna benzer bir cevap ekledim
— wiherek

1
Her yönüyle dinamik bir arka plana ihtiyacınız olan bir direktifin hepsine uyması mantıklıdır. Sorunun daha az yeniden kullanılabilir olduğu belirtildi.
— Christian Bonato

Açısal 1.5.8'de çalışmaz, yine de görüntüyü imgURLayarlanmamış olarak yüklemeye çalışır ve ayarlandığında yeniden dener imgURL.
— leroydev

Bu yanlıştır, URL'nizde @% gibi özel değişkenleriniz varsa, kesilir.
— efwjames

69

Yukarıdaki cevap gözlemlenebilir enterpolasyonu desteklemez (ve hata ayıklamaya çalışırken bana çok zaman harcadı). JsFiddle bağlantı @BrandonTilley yorumda ben yeniden yazı edeceğiz buraya korunması için benim için çalıştı cevap, oldu:

app.directive('backImg', function(){
    return function(scope, element, attrs){
        attrs.$observe('backImg', function(value) {
            element.css({
                'background-image': 'url(' + value +')',
                'background-size' : 'cover'
            });
        });
    };
});

Denetleyici ve şablon kullanma örneği

Denetleyici:

$scope.someID = ...;
/* 
The advantage of using directive will also work inside an ng-repeat :
someID can be inside an array of ID's 
*/

$scope.arrayOfIDs = [0,1,2,3];

Şablon:

Şablonda şu şekilde kullanın:

<div back-img="img/service-sliders/{{someID}}/1.jpg"></div>

ya da böyle:

<div ng-repeat="someID in arrayOfIDs" back-img="img/service-sliders/{{someID}}/1.jpg"></div>

40

Aşağıdakilerle böyle bir şey yapmak da mümkündür ng-style:

ng-style="image_path != '' && {'background-image':'url('+image_path+')'}"

mevcut olmayan bir görüntüyü getirmeye çalışmaz.


2
@sqren ayrıca Angular'ın yeni bir sürümünü (1.1.5 ve üstü) kullanıyorsanız da bunu görür: stackoverflow.com/a/12151492/1218080 . Görünümlerde gerçek bir üçlü operatör için destek eklendi.
— holografik prensip

bunun gibi basit dize birleştirme benim için enterpolasyon yerine kapsam nesnesinde çalıştı.
— Shardul

25

Hooblei'nin cevabına benzer şekilde, sadece enterpolasyonla:

<li ng-style="{'background-image': 'url({{ image.source }})'}">...</li>

1
Burada işe yaramadı: <span ng-style="{'background-image': 'url(/styles/images/profile.png)'}" style="background-image: url("");"></span>. @hooblei yaklaşımı işe yaradı.
— Marcos Lima

Aynı sonucu elde etme :(
— Kushal Jayswal

9

sadece bir zevk meselesidir, ancak değişkene veya işleve doğrudan bu şekilde erişmeyi tercih ediyorsanız:

<div id="playlist-icon" back-img="playlist.icon">

bunun gibi enterpolasyon yapmak yerine:

<div id="playlist-icon" back-img="{{playlist.icon}}">

yönergeyi öznitelikte scope.$watchne yapacağından biraz farklı tanımlayabilirsiniz.$parse

angular.module('myApp', [])
.directive('bgImage', function(){

    return function(scope, element, attrs) {
        scope.$watch(attrs.bgImage, function(value) {
            element.css({
                'background-image': 'url(' + value +')',
                'background-size' : 'cover'
            });
        });
    };
})

burada daha fazla arka plan var: AngularJS: $ observe ve $ watch yöntemleri arasındaki fark


2

@jaime cevabınız iyi. Ancak sayfanızda http.get varsa, ng-if

app.directive('backImg', function(){
    return function($scope, $element, $attrs){
        var url = $attrs.backImg;
        $element.css({
            'background-image': 'url(' + url + ')',
            'background-size': 'cover'
        });
    }
});

fabrikada

app.factory('dataFactory', function($http){
    var factory = {};
    factory.getAboutData = function(){
        return $http.get("api/about-data.json");
    };
    return factory;
});

kontrolör alanında

app.controller('aboutCtrl', function($scope, $http, dataFactory){
    $scope.aboutData = [];
    dataFactory.getAboutData().then(function(response){
        // get full home data
        $scope.aboutData = response.data;
        // banner data
        $scope.banner = {
            "image": $scope.aboutData.bannerImage,
            "text": $scope.aboutData.bannerText
        };
    });
});

ve eğer aşağıdaki gibi ng-if kullanırsanız, görüntüyü enterpolasyon ile alırsınız, aksi takdirde yönerge HTTP isteğinden önce değeri alır.

<div class="stat-banner"  ng-if="banner.image" background-image-directive="{{banner.image}}">

1

Eşzamansız durumumda en iyi şekilde çalışmak için DOM'dan stili soyutlayan 1.5 bileşenle buldum.

Misal:

<div ng-style="{ 'background': $ctrl.backgroundUrl }"></div>

Ve denetleyicide bir şey bunu seviyor:

this.$onChanges = onChanges;

function onChanges(changes) {
    if (changes.value.currentValue){
        $ctrl.backgroundUrl = setBackgroundUrl(changes.value.currentValue);
    }
}

function setBackgroundUrl(value){
    return 'url(' + value.imgUrl + ')';
}

0

Bahsettiğiniz ng-srcve sayfanızın resminizi yüklemeden önce oluşturmayı bitirmesini istediğiniz gibi göründüğünden , tarayıcı işlemeyi bitirdikten sonra yerel yönerge çalıştırmak için jaime'nin yanıtını değiştirebilirsiniz .

Bu blog yazısı bunu gayet iyi açıklıyor; esas olarak, eklemek $timeoutsarıcı için window.setTimeoutCSS için bu değişiklikler yapmak olup, burada geri arama işlevi önce.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.