কৌণিক সংস্থা: ব্যাকগ্রাউন্ড-চিত্রের জন্য এনজি-এসসিআর সমতুল্য: ইউআরএল (…)


150

Angularjs আপনি আছেন ট্যাগ ng-src যা উদ্দেশ্য আপনি আগে angularjs ভেরিয়েবল মধ্যে স্থাপন মূল্যায়ন পায় একটি অবৈধ URL এর জন্য একটি ত্রুটি পাবেন না হয়েছে {{এবং }}।

সমস্যাটি হ'ল আমি background-imageএকটি ইউআরএল সেট নিয়ে বেশ কিছু ডিআইভি ব্যবহার করি । আমি দুর্দান্ত সিএসএস 3 সম্পত্তি background-sizeযা ডিআইভির সঠিক আকারে চিত্রটি ফসল করে তা করার জন্য আমি এটি করি।

একমাত্র সমস্যা হ'ল তারা এনজি-এসসিআর ট্যাগ তৈরি করার ঠিক একই কারণে আমি প্রচুর ত্রুটি পেয়েছি: ইউআরএলটিতে আমার কিছু ভেরিয়েবল রয়েছে এবং ব্রাউজারটি মনে করে যে চিত্রটি নেই।

আমি বুঝতে পারি যে কোনও ক্রুড লেখার সম্ভাবনা রয়েছে {{"style='background-image:url(myVariableUrl)'"}}তবে এটি 'নোংরা' বলে মনে হচ্ছে।

আমি অনেক অনুসন্ধান করেছি এবং এটি করার সঠিক উপায় খুঁজে পাচ্ছি না। এই অ্যাপ্লিকেশনটি ত্রুটিযুক্ত হয়ে উঠছে all

উত্তর:


200

ngSrcএকটি স্থানীয় নির্দেশিকা, সুতরাং দেখে মনে হচ্ছে আপনি একটি অনুরূপ দিকনির্দেশনা চান যা আপনার ডিভের 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>

বোনাস হিসাবে চতুর বিড়ালগুলির সাথে জেএসফিডাল: http://jsfiddle.net/jaimem/aSjwk/1/


67
খুব সুন্দর নির্দেশ; একমাত্র সমস্যা হ'ল এটি বিরতি সমর্থন করে না। আমি সম্ভবত এটি এইভাবে সংশোধন করব: jsfiddle.net/BinaryMuse/aSjwk/2
— মিশেল

1
আপনাকে ধন্যবাদ, এটি কোনও প্রকার বিহীন ছাড়া ব্যাপার নয়, এর বিড়ালছানা রয়েছে!
— ভিজিয়ান স্কেলোরু

এটির সাথে কোনও সুরক্ষা সমস্যা যদি আপনি অবিশ্বস্ত উত্স থেকে লোড করছেন?
— আকিল ফার্নান্দেস

এই কাজ, কিন্তু শুধুমাত্র যদি আপনার ছবির URL ইতিমধ্যে সংজ্ঞায়িত করা হয়, ব্যবহার @mythz উত্তর stackoverflow.com/a/15537359/1479680 একটি উন্নততর obeservable URL এর
— Magico

229

এই আমার জন্য কাজ করে

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

22
আমি মনে করি এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। কাস্টম নির্দেশিকা যুক্ত করার দরকার নেই।
— জাকোব লাক্কে ম্যাডসেন

2
আমি
— সেইটির

1
এটি গতিময়, এই অর্থে যে কোনও নির্দেশিকা সবথেকে ফিট করে, যেখানেই আপনার গতিশীল পটভূমি প্রয়োজন। প্রশ্নটি উল্লেখ করেছে এটি কম পুনরায় ব্যবহারযোগ্য বলে মনে হয়েছে।
— খ্রিস্টান বোনাটো

কৌণিক 1.5.8 তে কাজ করে না, এটি এখনও imgURLসেট না করে চিত্রটি লোড করার চেষ্টা করে এবং সেট হয়ে গেলে আবার চেষ্টা করে imgURL।
— লেরোয়দেব

এটি ভুল, আপনার ইউআরএলে @% এর মতো কোনও বিশেষ ভেরিয়েবল থাকলে তা ভেঙে যাবে।
— efwjames

69

উপরের উত্তরটি পর্যবেক্ষণযোগ্য বিরক্তি সমর্থন করে না (এবং ডিবাগ করার চেষ্টা করার জন্য আমাকে অনেক সময় ব্যয় করতে পারে)। JsFiddle লিংক @BrandonTilley মন্তব্যে উত্তর যে আমার জন্য কাজ, যা আমি সংরক্ষণের জন্য পুনরায় পোস্ট করব এখানে ছিল:

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>

40

এটি দিয়ে এরকম কিছু করাও সম্ভব ng-style:

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

যা কোনও অ-বিদ্যমান চিত্র আনার চেষ্টা করবে না।


2
আপনি যদি কৌনিক (1.1.5 এবং তার বেশি) এর একটি নতুন সংস্করণ ব্যবহার করেন তবে @ এসক্রেইন এটিও দেখুন: stackoverflow.com/a/12151492/1218080 । ভিউগুলিতে প্রকৃত টেরিনারি অপারেটরের জন্য সমর্থন যুক্ত করা হয়েছিল।
— হলোগ্রাফিক-নীতি

এর মতো সরল স্ট্রিং কনটেনটেশন আমার জন্য ইন্টারপোলেশনের পরিবর্তে স্কোপ অবজেক্টে কাজ করেছিল।
— শারদুল

25

হুবিলির জবাবের সাথে সাদৃশ্য, কেবল অন্তরঙ্গকরণের সাথে:

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

1
এখানে কাজ করে নি: <span ng-style="{'background-image': 'url(/styles/images/profile.png)'}" style="background-image: url("");"></span>। @ হুবলেই পদ্ধতির কাজ হয়েছে।
— মার্কোস লিমা

একই ফলাফল পাওয়া :(
— কুশল জয়েসওয়াল

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: $ পর্যবেক্ষণ এবং $ ঘড়ির পদ্ধতির মধ্যে পার্থক্য


2

@ জাইম আপনার উত্তর ভাল আছে। তবে আপনার পৃষ্ঠায় যদি $ http.get থাকে তবে আপনি এনজি-ইফ ব্যবহার করতে পারেন

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

এবং ভিউটি যদি আপনি নীচের মতো এনজি-ব্যবহার করেন তবে আপনি ছবিটি অন্যরকমভাবে ফাঁকে ফাঁকে পেয়ে যাবেন, আপনি চিত্রটি পেতে পারবেন না কারণ এইচটিটিপি অনুরোধের আগে নির্দেশিকাটির মান পাওয়া যায়।

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

1

আমি 1.5 টি উপাদান পেয়েছি যা আমার অসম্পূর্ণ পরিস্থিতিতে সবচেয়ে ভাল কাজ করার জন্য ডিওএম থেকে স্টাইলিং বিমূর্ত করে।

উদাহরণ:

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

0

যেহেতু আপনি উল্লেখ করেছেন ng-srcএবং মনে হয় আপনি নিজের চিত্রটি লোড করার আগে পৃষ্ঠাটি রেন্ডারিং শেষ করতে চান, তাই ব্রাউজারটি রেন্ডারিং শেষ করার পরে আপনি জাইমের উত্তর পরিবর্তন করতে পারেন স্থানীয় নির্দেশিকা চালানোর জন্য ।

এই ব্লগ পোস্টটি এটি বেশ ভাল ব্যাখ্যা করে; মূলত, আপনি সন্নিবেশ $timeoutমোড়কের জন্য window.setTimeoutযেখানে আপনি সিএসএস সেই পরিবর্তন করতে কলব্যাক ফাংশন আগে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.