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.