152

在 angularjs 中,您有标签 ng-src{{ ,其目的是在 angularjs 评估放置在和之间的变量之前,您不会收到无效 url 的错误}}

问题是我使用了相当多的DIV,并background-image设置了一个url。我这样做是因为优秀的 CSS3 属性background-size可以将图像裁剪为 DIV 的确切大小。

唯一的问题是我收到很多错误,原因与他们创建 ng-src 标记的原因完全相同:我在 url 中有一些变量,浏览器认为图像不存在。

我意识到有可能写一个粗略的{{"style='background-image:url(myVariableUrl)'"}},但这看起来很“脏”。

我已经搜索了很多,找不到正确的方法来做到这一点。由于所有这些错误,我的应用程序变得一团糟。

4

9 回答 9

232

这个对我有用

<li ng-style="{'background-image':'url(/static/'+imgURL+')'}">...</li>
于 2013-05-13T01:37:51.877 回答
201

ngSrc是一个本机指令,因此您似乎想要一个类似的指令来修改您的 div 的 background-image样式。

你可以编写你自己的指令来做你想要的。例如

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

你会这样调用

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

JSFiddle 与可爱的猫作为奖励:http: //jsfiddle.net/jaimem/aSjwk/1/

于 2012-12-08T21:51:12.540 回答
69

上面的答案不支持可观察插值(并且花了我很多时间尝试调试)。@BrandonTilley 评论中的jsFiddle 链接是对我有用的答案,我将在此处重新发布以进行保存:

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

使用控制器和模板的示例

控制器 :

$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];

模板 :

像这样在模板中使用:

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

或者像这样:

<div ng-repeat="someID in arrayOfIDs" back-img="img/service-sliders/{{someID}}/1.jpg"></div>
于 2013-03-21T00:29:33.930 回答
40

也可以这样做ng-style

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

它不会尝试获取不存在的图像。

于 2013-06-03T16:52:37.373 回答
25

类似于 hooblei 的答案,只是插值:

<li ng-style="{'background-image': 'url({{ image.source }})'}">...</li>
于 2014-08-20T20:57:11.253 回答
9

只是口味问题,但如果您更喜欢像这样直接访问变量或函数:

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

而不是像这样插值:

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

然后您可以稍微不同地定义指令,scope.$watch这将$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'
            });
        });
    };
})

这里有更多背景知识:AngularJS : Difference between the $observe and $watch methods

于 2014-12-22T13:12:58.247 回答
2

@jaime 你的回答很好。但是如果你的页面有 $http.get 那么你就可以使用 ng-if

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

在工厂

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

在控制器区域

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
        };
    });
});

如果您使用下面的 ng-if 和视图,那么您将通过插值获得图像,否则,您将无法获得图像,因为指令在 HTTP 请求之前获取值。

<div class="stat-banner"  ng-if="banner.image" background-image-directive="{{banner.image}}">
于 2017-03-13T04:59:20.587 回答
1

我发现 1.5 组件从 DOM 中抽象出样式以在我的异步情况下工作得最好。

例子:

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

在控制器中,类似这样的内容:

this.$onChanges = onChanges;

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

function setBackgroundUrl(value){
    return 'url(' + value.imgUrl + ')';
}
于 2017-02-23T14:07:09.423 回答
0

由于您提到ng-src并且似乎您希望页面在加载图像之前完成渲染,您可以修改 jaime 的答案以在浏览器完成渲染后运行本机指令。

这篇博文很好地解释了这一点;本质上,您在回调函数之前插入$timeout包装器,您可以window.setTimeout在其中对 CSS 进行这些修改。

于 2015-01-15T04:49:04.807 回答