AngularJS: এনজি-অন্তর্ভুক্ত ভিতরে কৌনিক লোড স্ক্রিপ্ট কিভাবে করবেন?


85

আরে আমি কৌনিক সহ একটি ওয়েব পৃষ্ঠা তৈরি করছি। সমস্যাটি হ'ল ইতিমধ্যে কৌণিক ব্যতীত কিছু কিছু তৈরি হয়েছে এবং আমাকে সেগুলিও অন্তর্ভুক্ত করতে হবে

সমস্যা হ'ল এটি।

আমার প্রধান এইচটিএমএলে আমার এরকম কিছু রয়েছে:

<ngInclude src="partial.html">
</ngInclude>

এবং আমার আংশিক এইচটিএমএলের কিছু আছে

<h2> heading 1 <h2>
<script type="text/javascript" src="static/js/partial.js">
</script>

এবং আমার আংশিক.জেএস এর অ্যাংুলারজগুলির সাথে কোনও সম্পর্ক নেই। nginclude কাজ করে এবং আমি এইচটিএমএল দেখতে পাচ্ছি, তবে জাভাস্ক্রিপ্ট ফাইলটি লোড হওয়া মোটেও দেখতে পাচ্ছি না। ফায়ারব্যাগ / ক্রোম-ডেভ-সরঞ্জামটি কীভাবে ব্যবহার করতে হয় তা আমি জানি তবে নেটওয়ার্ক অনুরোধটি করা হচ্ছে তা আমি দেখতেও পাই না। আমি কি ভুল করছি?

আমি কৌনিকটির স্ক্রিপ্ট ট্যাগটির কিছু বিশেষ অর্থ রেখেছি। আমি কি ওভাররাইড করতে পারি?

উত্তর:


101

গৃহীত উত্তর 1.2.0-rc1 + (গিথুব ইস্যু ) থেকে কাজ করবে না ।

এন্ডোরামা দ্বারা তৈরি একটি দ্রুত ফিক্স এখানে দেওয়া হয়েছে :

/*global angular */
(function (ng) {
  'use strict';

  var app = ng.module('ngLoadScript', []);

  app.directive('script', function() {
    return {
      restrict: 'E',
      scope: false,
      link: function(scope, elem, attr) {
        if (attr.type === 'text/javascript-lazy') {
          var code = elem.text();
          var f = new Function(code);
          f();
        }
      }
    };
  });

}(angular));

কেবল এই ফাইলটি যুক্ত করুন, ngLoadScriptঅ্যাপ্লিকেশন নির্ভরতা হিসাবে মডিউল লোড করুন এবং type="text/javascript-lazy"স্ক্রিপ্টের জন্য টাইপ হিসাবে ব্যবহার করুন যা আপনাকে পার্টিয়ালে অলসভাবে লোড করতে হবে:

<script type="text/javascript-lazy">
  console.log("It works!");
</script>

4
আমি মনে করি না যদি আপনার স্ক্রিপ্ট ট্যাগটিতে ইনলাইন জেএসের পরিবর্তে কোনও এসসিআর বৈশিষ্ট্য থাকে।
ব্লেস্কোভিচ

9
@ ব্লাস্কোভিজ এই চেষ্টা করে দেখুন: gist.github.com/subudeepak/9617483#file-angular-loadscript-js
পাওলো মোরেটি

4
এটি নিখুঁতভাবে কাজ করে, তবে আমার আরও একটি জিনিস চাই। একবার নির্দেশটি ধ্বংস হয়ে গেলে আমি কীভাবে এটি সরিয়ে ফেলব?
SLearner

যখন আমি অলস স্ক্রিপ্টে কন্ট্রোলার ঘোষণা করি তখন দৃশ্যে নিয়ামককে উল্লেখ করার সময় আমি ত্রুটি পেয়েছি। তুমি কি জানো কেন?
চ্যাংওয়ং ঝাং

কৌতুকটি করেছে। আমি এটি ব্যবহার করেছি আংশিক লোড হওয়া ট্যাবসেটের জন্য ট্যাব সূচনা কোডটি চালানোর জন্য
LKallipo

39

সংক্ষিপ্ত উত্তর: AngularJS ("jqlite") এটি সমর্থন করে না। আপনার পৃষ্ঠায় jQuery অন্তর্ভুক্ত করুন (কৌণিক অন্তর্ভুক্ত করার আগে) এবং এটি কাজ করা উচিত। Https://groups.google.com/d/topic/angular/H4haaMePJU0/ddusussion দেখুন


4
যদি আপনার আংশিক.জেএসগুলিতে একটি নিয়ামক থাকে তবে এটি কীভাবে কাজ করবে? নিয়ামক লোড হওয়ার আগে এই টেমপ্লেটটি রেন্ডার করবে এবং একটি ত্রুটি দেবে: আর্গুমেন্ট 'মাইকন্ট্রোলার' কোনও ফাংশন নয়, অপরিশোধিত হয়েছে।
sthomps

4
@ স্টোম্পস, দেখুন এটি সাহায্য করে কিনা: গতিশীলভাবে একটি নিয়ামক লোড হচ্ছে
মার্ক রাজকোক

16
আমি বুঝতে পারি না কেন এটি কাজ করে - ব্রাউজারটি স্বয়ংক্রিয়ভাবে কোনও ইনজেকশন স্ক্রিপ্ট ট্যাগ লোড করবে না? কেন এটি একটি jQuery বা jqLite উদ্বেগ?
স্কট কোটস

আমার পক্ষেও কাজ করেছেন, আমার <script> ট্যাগের বিষয়বস্তুটি ছিল কৌনিক সম্পর্কযুক্ত। যখন আমি নীচে আমার আংশিক এবং স্ক্রিপ্ট ট্যাগ সহ সমস্ত কিছু অ্যাংুলারজ করার আগে jQuery লোড করি নি তখন খুব অদ্ভুত।
নিক রাশুলার

20

আমি নিমির পদ্ধতির চেষ্টা করেছি, কিন্তু এটি 1.2.0-rc.3 ব্যবহার করে আমার পক্ষে কাজ করে নি। স্ক্রিপ্ট ট্যাগটি ডিওমে sertedোকানো হত তবে জাভাস্ক্রিপ্টের পথটি লোড হবে না। আমার সন্দেহ হয় যে এটি যে জাভাস্ক্রিপ্টটি লোড করার চেষ্টা করছিলাম তা অন্য কোনও ডোমেন / প্রোটোকল থেকে। তাই আমি একটি ভিন্ন পদ্ধতির নেন, এবং এই কি আমি নিয়ে এসেছেন, Google- এর ব্যবহার করে একটি উদাহরণ হিসাবে মানচিত্র: ( সারকথা )

angular.module('testApp', []).
    directive('lazyLoad', ['$window', '$q', function ($window, $q) {
        function load_script() {
            var s = document.createElement('script'); // use global document since Angular's $document is weak
            s.src = 'https://maps.googleapis.com/maps/api/js?sensor=false&callback=initialize';
            document.body.appendChild(s);
        }
        function lazyLoadApi(key) {
            var deferred = $q.defer();
            $window.initialize = function () {
                deferred.resolve();
            };
            // thanks to Emil Stenström: http://friendlybit.com/js/lazy-loading-asyncronous-javascript/
            if ($window.attachEvent) {  
                $window.attachEvent('onload', load_script); 
            } else {
                $window.addEventListener('load', load_script, false);
            }
            return deferred.promise;
        }
        return {
            restrict: 'E',
            link: function (scope, element, attrs) { // function content is optional
            // in this example, it shows how and when the promises are resolved
                if ($window.google && $window.google.maps) {
                    console.log('gmaps already loaded');
                } else {
                    lazyLoadApi().then(function () {
                        console.log('promise resolved');
                        if ($window.google && $window.google.maps) {
                            console.log('gmaps loaded');
                        } else {
                            console.log('gmaps not loaded');
                        }
                    }, function () {
                        console.log('promise rejected');
                    });
                }
            }
        };
    }]);

আমি আশা করি এটি কারও জন্য সহায়ক।


4
অদ্ভুত, আমি আমার নিজস্ব সংস্করণটি বাইরের স্ক্রিপ্টগুলির সাথে 1.2.0-rc3 এ তৈরি করেছি :) আপনার সংস্করণটি যাইহোক ভাল হয়েছে, এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ!
নিমজি

12

স্ক্রিপ্ট ফাইলটি গতিশীলভাবে লোড করার জন্য আমি এই পদ্ধতিটি ব্যবহার করেছি (একটি নিয়ামকের অভ্যন্তরে)।

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = "https://maps.googleapis.com/maps/api/js";
document.body.appendChild(script);

সুন্দর একটি @azmeer
আলী

ভোট দেওয়া হয়েছে কারণ এটি গতিশীল স্ক্রিপ্ট লোডিংয়ের জন্য সহজ এবং সর্বোত্তম সমাধান।
আরএলডি

8

এটি 1.2.0-rc1 থেকে আর কাজ করবে না। এটি সম্পর্কে আরও জানার জন্য এই সমস্যাটি দেখুন , যাতে আমি একটি তাত্ক্ষণিকভাবে কর্মসংস্থান বর্ণনা করে একটি মন্তব্য পোস্ট করেছি। আমি এখানে এটি ভাগ করে নেব:

// Quick fix : replace the script tag you want to load by a <div load-script></div>.
// Then write a loadScript directive that creates your script tag and appends it to your div.
// Took me one minute.

// This means that in your view, instead of :
<script src="/path/to/my/file.js"></script>

// You'll have :
<div ng-load-script></div>

// And then write a directive like :
angular.module('myModule', []).directive('loadScript', [function() {
    return function(scope, element, attrs) {
        angular.element('<script src="/path/to/my/file.js"></script>').appendTo(element);
    }
}]);

সর্বকালের সেরা সমাধান নয়, তবে ওহে, না পরবর্তী ভিউগুলিতে স্ক্রিপ্ট ট্যাগগুলি রাখছেন না। আমার ক্ষেত্রে আমাকে এটি করতে হবে ফেসবুক / টুইটার / ইত্যাদি ব্যবহার করার আদেশ। উইজেট


4

ocLazyLoad রাউটারগুলির মাধ্যমে টেমপ্লেট / ভিউগুলিতে অলসভাবে স্ক্রিপ্টগুলি লোড করতে দেয় (যেমন ইউআই-রাউটার)। এখানে একটি স্নিপলেট আছে

$stateProvider.state('parent', {
    url: "/",
    resolve: {
        loadMyService: ['$ocLazyLoad', function($ocLazyLoad) {
             return $ocLazyLoad.load('js/ServiceTest.js');
        }]
    }
})
.state('parent.child', {
    resolve: {
        test: ['loadMyService', '$ServiceTest', function(loadMyService, $ServiceTest) {
            // you can use your service
            $ServiceTest.doSomething();
        }]
    }
});  

আমি একই মত একই সমস্যার মুখোমুখি। এন্টারপ্রাইজ অ্যাপ্লিকেশানে আপনি এখন তার ভাল ব্যবহার করার জন্য আপনার সব রুটে ব্যবহার করতে হবে ট্যাব সঙ্গে NG-অন্তর্গত কিন্তু NG-অন্তর্ভুক্ত .. তার বিষয় কোনটা এটা কোন নির্ভরতা লোড বৈশিষ্ট্য আছে হয়েছে
Serak Shiferaw

1

একটি থেকে গতিগতভাবে পুনঃনির্ধারণ লোড করতে ui-viewআমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করি:

ইন application.js:

    .directive('script', function($parse, $rootScope, $compile) {
    return {
        restrict: 'E',
        terminal: true,
        link: function(scope, element, attr) {
            if (attr.ngSrc) {
                 var domElem = '<script src="'+attr.ngSrc+'" async defer></script>';
                 $(element).append($compile(domElem)(scope));


            }
        }
    };
});

ইন myPartial.client.view.html:

 <script type="application/javascript" ng-src="http://www.google.com/recaptcha/api.js?render=explicit&onload=vcRecaptchaApiLoaded"></script>

এটি কৌনিক নেটিভ স্ক্রিপ্টের নির্দেশকে যুক্ত করে বা ওভাররাইড করে? এবং যে যে jquery ব্যবহার করে?
জ্যামি

4
এটি যোগ করে। এবং না, কোনও জ্যাকোয়ারি সেখানে ব্যবহৃত হয় না
মাইকেল ড্রপার

thx - 'এখানে কোনও জিক্যুয়ারি ব্যবহার করা হয় না' -আপনি- $(element)কেন আপনার $()সিনট্যাক্সের দরকার নেই । এজেএস ডক্স থেকে 'কৌণিক সংক্রান্ত সমস্ত উপাদান উল্লেখ সবসময় jQuery বা jqLite দিয়ে আবৃত থাকে (যেমন কোনও নির্দেশকের সংকলন / লিঙ্ক ফাংশনে উপাদান যুক্তি) - সুতরাং এবং আমার অন্যান্য অভিজ্ঞতা থেকে - আমি আশা করছিলাম আপনি' উপাদানটি ব্যবহার করবেন। অ্যাপেন্ড (...) `- যদিও আমি শেষ পর্যন্ত যা ব্যবহার করতে পারি তা শেষ করেছিলাম - যখন আমি অংশটি দেখেছি এবং যখন আমি কেবল 'এলিমেন্ট.অ্যাপেন্ড' দিয়ে কাজ করার চেষ্টা করেছি তখন আমার পক্ষে কাজ করেনি তখন পরীক্ষা করেছিলাম সিনট্যাক্স
জ্যামি

হ্যাঁ এটি হ্যাঁ, তবে আপনি যদি এটি চান তবে কৌনিক.এলিমেন্ট () দিয়ে এটি প্রতিস্থাপন করতে পারেন, সম্ভবত।
মাইকেল ড্রপার

0

দুর্ভাগ্যক্রমে এই পোস্টে থাকা সমস্ত উত্তর আমার পক্ষে কার্যকর হয়নি। আমি নিম্নলিখিত ত্রুটি পেতে থাকি।

'ডকুমেন্ট' -তে 'রাইটিং' কার্যকর করতে ব্যর্থ: অসম্পূর্ণভাবে লোড হওয়া বাহ্যিক স্ক্রিপ্ট থেকে কোনও ডকুমেন্টে স্পষ্টভাবে খোলা না থাকলে লেখা সম্ভব নয়।

আমি জানতে পেরেছি যে আপনি যদি কিছু তৃতীয় পক্ষের উইজেট (আমার ক্ষেত্রে ডিমান্ডফোর্স) ব্যবহার করেন যা অতিরিক্ত বাহ্যিক জাভাস্ক্রিপ্ট ফাইলগুলিতে কল করে এবং এইচটিএমএল সন্নিবেশ করানোর চেষ্টা করে তবে এটি ঘটে। কনসোল এবং জাভাস্ক্রিপ্ট কোডটি দেখে আমি একাধিক লাইন লক্ষ্য করেছি:

document.write("<script type='text/javascript' "..."'></script>");

আমি তৃতীয় পক্ষের জাভাস্ক্রিপ্ট ফাইলগুলি ব্যবহার করেছি (htmlParser.js এবং পোষ্টস্ক্রিপ.জেএস): https://github.com/krux/postscribe থেকে । এটি এই পোস্টে সমস্যার সমাধান করেছে এবং একই সাথে উপরের ত্রুটিটি স্থির করেছে।

(আমার কাছে এখন টাইট সময়সীমার অধীনে এটি ছিল একটি দ্রুত এবং নোংরা উপায়। তৃতীয় পক্ষের জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করতে আমি স্বাচ্ছন্দ্যবোধ করি না I আমি আশা করি যে কোনও ক্লিনার এবং আরও ভাল উপায় নিয়ে আসতে পারে))


0

আমি গুগল রেক্যাপচা স্পষ্টভাবে ব্যবহার করার চেষ্টা করেছি। এখানে উদাহরণ:

// put somewhere in your index.html
<script type="text/javascript">
var onloadCallback = function() {
  grecaptcha.render('your-recaptcha-element', {
    'sitekey' : '6Ldcfv8SAAAAAB1DwJTM6T7qcJhVqhqtss_HzS3z'
  });
};

//link function of Angularjs directive
link: function (scope, element, attrs) {
  ...
  var domElem = '<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>';
  $('#your-recaptcha-element').append($compile(domElem)(scope));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.