Angularjsには、 tag ng-src があります。これは、angularjsが{{
と}}
の間に置かれた変数を評価する前に無効なURLのエラーを受け取らないという目的があります。
問題は、background-image
をURLに設定したDIVをかなり使用していることです。これは、CSV3の優れたプロパティbackground-size
により、画像をDIVの正確なサイズにトリミングするためです。
唯一の問題は、ng-srcタグを作成したのとまったく同じ理由で多くのエラーを受け取ることです。URLに変数があり、ブラウザは画像が存在しないと考えています。
粗雑な{{"style='background-image:url(myVariableUrl)'"}}
を記述する可能性があることを認識していますが、これは「汚い」ようです。
私はよく検索しましたが、これを行う正しい方法が見つかりません。これらのすべてのエラーのため、私のアプリは混乱になりつつあります。
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/
これは私のために働く
<li ng-style="{'background-image':'url(/static/'+imgURL+')'}">...</li>
上記の答えは、観測可能な補間をサポートしていません(デバッグに多くの時間を費やしました)。 @BrandonTilleyのコメントの jsFiddle link が私にとって有効な答えでした。保存のためにここに再投稿します。
app.directive('backImg', function(){
return function(scope, element, attrs){
attrs.$observe('backImg', function(value) {
element.css({
'background-image': 'url(' + value +')',
'background-size' : 'cover'
});
});
};
});
コントローラーとテンプレートを使用した例
Controller:
$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>
ng-style
を使用して次のようなことを行うこともできます。
ng-style="image_path != '' && {'background-image':'url('+image_path+')'}"
存在しない画像を取得しようとしません。
補間を使用したhoobleiの答えと同様:
<li ng-style="{'background-image': 'url({{ image.source }})'}">...</li>
好みの問題ですが、次のように変数または関数に直接アクセスしたい場合:
<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:$ observeと$ watchメソッドの違い
@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}}">
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 + ')';
}
ng-src
に言及したので、画像をロードする前にページのレンダリングを終了するように見えるため、jaimeの答えを変更してネイティブディレクティブafterを実行できますブラウザはレンダリングを終了します。
このブログ投稿 これについてはかなりよく説明しています。基本的に、CSSに変更を加えるコールバック関数の前に$timeout
に window.setTimeout
wrapper を挿入します。