পুনরায় খুলুন এবং ইতিমধ্যে বুটস্ট্র্যাপযুক্ত অ্যাপ্লিকেশনে নির্ভরতা যুক্ত করুন


89

ইতিমধ্যে বুটস্ট্র্যাপযুক্ত কৌণিক মডিউলটির জন্য দেরী নির্ভরতা ইনজেকশনের কোনও উপায় আছে কি? আমি যা বলতে চাইছি তা এখানে:

বলুন যে আমার কাছে সাইট-প্রশস্ত কৌণিক অ্যাপ রয়েছে, এটি সংজ্ঞায়িত হয়েছে:

// in app.js
var App = angular.module("App", []);

এবং প্রতিটি পৃষ্ঠায়:

<html ng-app="App">

পরে, আমি বর্তমান পৃষ্ঠার প্রয়োজনের ভিত্তিতে যুক্তি যুক্ত করতে অ্যাপটি আবার খুলছি:

// in reports.js
var App = angular.module("App")
App.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

এখন, (যেমন বলতে যুক্তিবিজ্ঞান যারা অন-ডিমান্ড বিট যে এক তাদের নিজস্ব নির্ভরতা প্রয়োজন ngTouch, ngAnimate, ngResource, ইত্যাদি)। আমি কীভাবে এগুলিকে বেস অ্যাপে সংযুক্ত করতে পারি? এটি কাজ করে বলে মনে হচ্ছে না:

// in reports.js
var App = angular.module("App", ['ui.event', 'ngResource']); // <-- raise error when App was already bootstrapped

আমি বুঝতে পারি আমি আগেই সবকিছু করতে পারি, যেমন -

// in app.js
var App = angular.module("App", ['ui.event', 'ngResource', 'ngAnimate', ...]);

বা প্রতিটি মডিউল তার নিজস্ব হিসাবে সংজ্ঞায়িত করুন এবং তারপরে মূল অ্যাপ্লিকেশনটিতে সবকিছু ইনজেক্ট করুন ( আরও তথ্যের জন্য এখানে দেখুন ):

// in reports.js
angular.module("Reports", ['ui.event', 'ngResource'])
.controller("ReportsController", ['$scope', function($scope) {
  // .. reports controller code
}])

// in home.js
angular.module("Home", ['ngAnimate'])
.controller("HomeController", ['$scope', '$http', function($scope, $http){
  // ...
}])

// in app.js, loaded last into the page (different for every page that varies in dependencies)
var App = angular.module("App", ['Reports', 'Home'])

তবে এটির জন্য বর্তমান পৃষ্ঠার নির্ভরতাগুলির সাথে আমি অ্যাপটি প্রতিবারই শুরু করতে হবে।

আমি app.jsপ্রতিটি পৃষ্ঠায় বেসিকটি অন্তর্ভুক্ত করতে পছন্দ করি এবং প্রতিটি পৃষ্ঠায় ( reports.jsবা home.js, ইত্যাদির) প্রয়োজনীয় এক্সটেনশনগুলি কেবলমাত্র আমি যুক্ত করি বা মুছে ফেলা না হলে বুটস্ট্র্যাপিং যুক্তিটিকে সংশোধন না করেই প্রবর্তন করি।

অ্যাপ্লিকেশনটি ইতিমধ্যে বুটস্ট্র্যাপ করা অবস্থায় নির্ভরতার পরিচয় দেওয়ার কোনও উপায় আছে কি? এটি করার জন্য মূর্তিবিহীন উপায় (বা উপায়) কী বিবেচনা করা হয়? আমি পরবর্তী সমাধানের দিকে ঝুঁকছি, তবে আমি দেখতে চেয়েছিলাম যে আমার বর্ণনার উপায়টিও করা যেতে পারে কিনা। ধন্যবাদ


আপনি কি আমাকে আপনার চূড়ান্ত কার্যকরী কোডটি দিতে পারেন, একবার দেখার জন্য?
মঙ্গু সিং রাজপুরোহিত

@ ব্যবহারকারী 2393267 মিমি, এত দিন হয়েছে, আমার এখনও সেই কোডটি আছে কিনা জানিনা ... দুঃখিত। আমি মনে করি আমি শেষ পর্যন্ত নকশাটি পুনর্বিবেচনা করেছি, কারণ সাধারণত যখন আমাকে জিনিসগুলি হ্যাক করতে হয় তার অর্থ আমি এটি সঠিকভাবে করছি না ... তবে, আপনি যদি এখনও এই পদ্ধতির অনুসরণ করার জন্য দৃ determined়প্রতিজ্ঞ হন তবে নীচের উত্তরটি একটি ভাল নেতৃত্বের মতো বলে মনে হচ্ছে ।
sa125

উত্তর:


115

আমি এটি এর মতো সমাধান করেছি:

আবার অ্যাপ্লিকেশন রেফারেন্স:

var app = angular.module('app');

তারপরে আপনার নতুন প্রয়োজনীয়তাগুলিকে প্রয়োজনীয়তার অ্যারেতে চাপ দিন:

app.requires.push('newDependency');

4
এটি আমার জন্য কাজ করে +1 আমি এটিকে একাধিক নির্ভরতা যেমন অ্যাপ্লিকেশন.প্রশেস ('ডক্টরসিটিআরএল', 'ডক্টর সার্ভিস') এর জন্য ব্যবহার করেছি;
আমির

8
এটি আমার আর্কিটেকচারকে বাঁচিয়েছে।
সা Saeedদ নেমতি

4
এটা আমার পক্ষে কাজ করছে না আমি বর্ণিত হিসাবে গতিশীলভাবে নির্ভরতা যুক্ত করছি, তবে অ্যাঙ্গুলার এখনও যুক্ত মডিউল থেকে কোনও পরিষেবা খুঁজে পাচ্ছে না।
স্লাভা ফমিন II

6
এবং app.requiresএকটি অ্যারে, সুতরাং আপনি যদি একাধিক নির্ভরতা যুক্ত করেন (আপনার প্রতিবেদনের উদাহরণ হিসাবে), আপনি সেগুলি পৃথক যুক্তি হিসাবে পৃথক করে push: app.requires.push('ui.event', 'ngResource');বা যদি আপনার অতিরিক্ত নির্ভরতা ইতিমধ্যে অ্যারে হয়:Array.prototype.push.apply(app.requires, ['ui.event', 'ngResource'])
রেড মটরটি

4
আমি মাঝে মাঝে ভোটিং এড়িয়ে যাই কারণ আমি লগইন করতে চাই না, এবার নয়! ধন্যবাদ!
কুলারবাইটস

12

সরল ... এইভাবে গেটর ব্যবহার করে মডিউলটির একটি উদাহরণ পান: var অ্যাপ্লিকেশন = কৌণিক.মডিউল ("অ্যাপ");

তারপরে এইভাবে "প্রয়োজনীয়" সংগ্রহটিতে যুক্ত করুন: app.requires [app.requires.length] = "এনজিআরসোর্স";

যাইহোক, এটি আমার পক্ষে কাজ করেছিল। খুব ভাল!


4
আমার জন্য কাজ! আমার একটি প্রশ্ন আছে - কেন ব্যবহার করবেন না: app.requires.push ("ngResource")?
ফিলিপ মুনিন

9

অ্যাঙ্গুলার জেএস গুগল গ্রুপের এই প্রস্তাব অনুযায়ী এই মুহুর্তে এই কার্যকারিতাটি বিদ্যমান নেই। আশা করি মূল দলটি এই কার্যকারিতা যুক্ত করার সিদ্ধান্ত নিয়েছে, এটি নিজেই ব্যবহার করতে পারে।


4
হ্যাঁ, এটি বিশেষত এমন লোকদের জন্য কার্যকর বলে মনে হচ্ছে যারা এসপিএ তৈরি করতে চান না।
নিয়মিত

4

আপনি যদি একসাথে একাধিক নির্ভরতা যুক্ত করতে চান তবে আপনি সেগুলি নিম্নলিখিতভাবে চাপতে পারেন:

<script>
    var app = angular.module('appName');
    app.requires.push('dependencyCtrl1', 'dependencyService1');
</script>

4

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

সমাধানের জন্য কৌণিকটি কাঁটাচামচ করা দরকার, সুতরাং আপনি আর সিডিএন ব্যবহার করতে পারবেন না। তবে পরিবর্তনটি খুব ছোট, তাই কেন আমি এই বৈশিষ্ট্যটি কৌণিকর মধ্যে বিদ্যমান না তা অবাক হয়েছি।

আমি গুগল গ্রুপগুলির লিঙ্কটি অনুসরণ করেছি যা এই প্রশ্নের অন্য উত্তরগুলির মধ্যে একটিতে সরবরাহ করা হয়েছিল । সেখানে আমি নীচের কোডগুলি পেয়েছি, যা সমস্যার সমাধান করেছে:

instanceInjector.loadNewModules = function (mods) {
  forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); });
};

আমি যখন এই কোডটি কৌনিক 1.5.0.0 উত্স কোডে 4414 নম্বরে যুক্ত করেছি ( createInjectorফাংশনের অভ্যন্তরে, return instanceInjector;বিবৃতি দেওয়ার আগে ), তখন এটি আমাকে বুটস্ট্র্যাপ করার পরে নির্ভরতা যুক্ত করতে সক্ষম করে $injector.loadNewModules(['ngCookies']);


? কি সমস্যা রয়েছে সর্বোচ্চ ভোট উত্তর (6/26/2017 হিসাবে) ? দেখে মনে হচ্ছে এটি পোস্ট করার এক বছরেরও বেশি সময় আগে এটি সরবরাহ করা হয়েছিল; আপনার উত্তর কিছু সুবিধা আছে?
লাল মটর

@ দ্য রেডপিয়া ঠিক আছে এর সাথে আমার কোন সমস্যা নেই, কেবল এটি আমার সমস্যার সমাধান করেনি, তবে এই উত্তরটি করেছে
tjespe

এবং এটি আপনার পক্ষে কার্যকর হয়নি কারণ, আমি অনুমান করছি, আপনি ইতিমধ্যে আপনার অ্যাপটি বুটপ্রেট করেছিলেন? আমি এটিও পর্যবেক্ষণ করেছি ...
দ্য রেড মটর

4
লিঙ্কযুক্ত গুগল কমিউনিটি পোস্টটি পড়ার পরে, আমি আরও নিশ্চিত যে বুটস্ট্র্যাপিং হ'ল কারণ এর মতো সমাধানের প্রয়োজনীয়। উত্সাহ দেওয়া কারণ মূল প্রশ্নটি একটি "ইতিমধ্যে বুটস্ট্র্যাপযুক্ত অ্যাপ্লিকেশন" সম্পর্কে জিজ্ঞাসা করেছিল, যা অন্য কেউ সম্বোধন করে না (প্রকৃতপক্ষে ওপিটির ভুল বানানো থাকতে পারে)
রেড মটর

1

সংস্করণ ১.6. Since থেকে অ্যাপটি ব্যবহার করে বুটস্ট্র্যাপ করার পরে অলস লোড মডিউলগুলি এখন সম্ভব $injector.loadNewModules([modules])। নীচে অ্যাঙ্গুলারজেএস ডকুমেন্টেশন থেকে নেওয়া একটি উদাহরণ রয়েছে:

app.factory('loadModule', function($injector) {
   return function loadModule(moduleName, bundleUrl) {
     return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });
   };
})

লোডনিউজমডিউলগুলি সম্পর্কে পুরো ডকুমেন্টেশন পড়ুন কারণ এর আশেপাশে কিছু গ্যাটাচ রয়েছে।

ওএমকডিরির সাথে এটি ইউআই-রাউটার ব্যবহার করে একটি খুব ভাল নমুনা অ্যাপ্লিকেশন রয়েছে

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