কৌণিক জেএস বীজ: আলাদা ফাইলগুলিতে জাভাস্ক্রিপ্ট স্থাপন করা (অ্যাপ্লিকেশন। জেএস, নিয়ন্ত্রণকারী.জেজেস, ডাইরেক্টিভ.জেএস, ফিল্টার.জেএস, পরিষেবাদি.জেএস)


93

আমি আমার অ্যাপ্লিকেশনটি কাঠামোর জন্য কৌণিক-বীজ টেম্পলেট ব্যবহার করছি । প্রাথমিকভাবে আমি আমার সমস্ত জাভাস্ক্রিপ্ট কোড একক ফাইলে রেখেছি main.js,। এই ফাইলটিতে আমার মডিউল ঘোষণা, নিয়ামক, নির্দেশাবলী, ফিল্টার এবং পরিষেবা রয়েছে। অ্যাপ্লিকেশনটি এর মতো সূক্ষ্মভাবে কাজ করে, তবে আমার অ্যাপ্লিকেশন আরও জটিল হওয়ার সাথে সাথে আমি স্কেলাবিলিটি এবং রক্ষণাবেক্ষণ সম্পর্কে চিন্তিত। আমি লক্ষ্য করেছি যে কৌণিক-বীজ টেম্পলেটটির প্রতিটিটির জন্য পৃথক পৃথক ফাইল রয়েছে, সুতরাং আমি এই কোডটির main.jsশিরোনামে উল্লিখিত অন্য ফাইলগুলির মধ্যে একটি কোড থেকে আমার কোডটি বিতরণের চেষ্টা করেছি app/jsএবং কৌনিকের ডিরেক্টরিতে পেয়েছি বীজ টেম্পলেট।

আমার প্রশ্নটি: অ্যাপ্লিকেশনটি কাজ করতে আমি নির্ভরতাগুলি কীভাবে পরিচালনা করব? এখানে পাওয়া বিদ্যমান ডকুমেন্টেশনগুলি এই বিষয়ে খুব স্পষ্ট নয় যেহেতু প্রদত্ত উদাহরণগুলির প্রতিটি একটিই জাভাস্ক্রিপ্ট উত্স ফাইল দেখায়।

আমার যা আছে তার একটি উদাহরণ:

app.js

angular.module('myApp', 
    ['myApp.filters',
     'myApp.services',
     'myApp.controllers']);

controllers.js

angular.module('myApp.controllers', []).
    controller('AppCtrl', [function ($scope, $http, $filter, MyService) {

        $scope.myService = MyService; // found in services.js

        // other functions...
    }
]);

filters.js

angular.module('myApp.filters', []).
    filter('myFilter', [function (MyService) {
        return function(value) {
            if (MyService.data) { // test to ensure service is loaded
                for (var i = 0; i < MyService.data.length; i++) {
                    // code to return appropriate value from MyService
                }
            }
        }
    }]
);

services.js

angular.module('myApp.services', []).
    factory('MyService', function($http) {
        var MyService = {};
        $http.get('resources/data.json').success(function(response) {
            MyService.data = response;
        });
        return MyService;
    }
);

main.js

/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);

myApp.factory('MyService', function($http) {
    // same code as in services.js
}

myApp.filter('myFilter', function(MyService) {
    // same code as in filters.js
}

function AppCtrl ($scope, $http, $filter, MyService) {
    // same code as in app.js
}

আমি কীভাবে নির্ভরতাগুলি পরিচালনা করব?

আগাম ধন্যবাদ.


4
এই সম্পর্কে কিছু নিবন্ধ আছে। উদাহরণস্বরূপ, ব্রি্যান্টফোর্ড.com / blog / huuuuuge-angular-apps.html এবং কিছু প্রকল্প , যোমেন এটির কাছে যাওয়ার দুটি উপায় রয়েছে: স্তরগুলি (কৌণিক-বীজের মতো) উপাদান দ্বারা আলাদা করা বা বৈশিষ্ট্য অনুসারে কিছু নিবন্ধের পরামর্শ অনুসারে ting
এডওয়ার্ড গ্যামোনাল

আপনি যখন ঘোষণা একটি মডিউল যেমন angular.module ( 'myApp.service1', []) আমি তোমাদের নির্ভরতা যোগ করতে হবে মনে [] যেমন , angular.module ( 'myApp.service1', [ 'myApp.service2' 'myApp .service2 '])। । আমি অ্যাংুলারজেএস-তে বেশ নতুন, তাই আমার ভুল হতে পারে। যদি এটি কার্যকর হয় তবে আমাকে জানান এবং আমি একটি উত্তর পোস্ট করব।
ড্যানি ভারোড

সেই লাইনটি কোথায় ?োকানো উচিত? আমি angular.module('myApp.services', ['myApp.services']);কোন ভাগ্য ছাড়াই app.js এ রেখেছি।
ক্রিসডেভো

@ ক্রিসডেভো ১. আপনি যখন মন্তব্যের জবাব দিন, সর্বদা মন্তব্যটি '@' এবং ব্যবহারকারীর নাম (ফাঁকা ছাড়াই) দিয়ে শুরু করুন, যাতে ব্যবহারকারী একটি বিজ্ঞপ্তি পাবেন। ২. মাইএপ.সার্ভিসেসগুলি নিজের উপর নয়, অন্য মডিউলগুলির উপর নির্ভরশীল হওয়া উচিত angular.module('myApp.services', ['myApp.server', 'myApp.somethingElse'])
ড্যানি ভারোড

@ ড্যানি ওয়ারোড, আপনি কি আগের মন্তব্যটি সম্পাদনা করেছেন? আমি এটি angular.module('myApp.service1', ['myApp.service1', 'myApp.service2'])মূল হিসাবে পড়া । অন্যথায় আমি মাই অ্যাপ.সার্ভিসিসকে এর নিজস্ব নির্ভরতা হিসাবে অন্তর্ভুক্ত করতাম না।
ক্রিসডেভো

উত্তর:


108

সমস্যাটি আপনার সমস্ত পৃথক ফাইলগুলিতে আপনার অ্যাপ্লিকেশন মডিউলটিকে "redeclaring" করার কারণে তৈরি হয়েছে।

এটি অ্যাপ্লিকেশন মডিউল ঘোষণার (নিশ্চিত নয় যে ঘোষণাটি সঠিক শব্দটি রয়েছে) এর মতো দেখাচ্ছে:

angular.module('myApp', []).controller( //...

আপনার অ্যাপ্লিকেশন মডিউলের ক্ষেত্রে এই নিয়োগটি (অ্যাসাইনমেন্টটি সঠিক শব্দটি কিনা তা নিশ্চিত নয়) যা হ'ল:

angular.module('myApp').controller( //...

বর্গাকার বন্ধনীগুলির অভাব লক্ষ্য করুন।

সুতরাং, সাবেক সংস্করণ, এক সঙ্গে বর্গাকার বন্ধনী, শুধুমাত্র সাধারণত আপনার একবার ব্যবহার করা উচিত, app.jsঅথবা main.js। অন্যান্য সমস্ত সম্পর্কিত ফাইল - নিয়ামক, নির্দেশিকা, ফিল্টারগুলি … - পরবর্তী সংস্করণ ব্যবহার করা উচিত, এটি স্কোয়ার বন্ধনী ছাড়াই

আমি আশা করি যে এটি উপলব্ধি করে। চিয়ার্স!


9
আমি এই সমস্যার সমাধান খুঁজে পেয়েছি। মনে হচ্ছে কেবল একটি মডিউল প্রয়োজন myApp। আমার অ্যাপ.জেএস ফাইলগুলিতে আমি এর জন্য একটি ভেরি তৈরি করেছি var myApp = angular.module('myApp', []);অন্য সমস্ত ফাইলগুলিতে আমি কেবল এই ভ্যারিকে উল্লেখ করেছি (উদাহরণস্বরূপ, myApp.filter('myFilter', function(MyService) { /* filter code */ });যতক্ষণ আমি আমার এইচটিএমএল-তে স্ক্রিপ্ট ট্যাগগুলিতে ফাইলের নাম যুক্ত করেছি , ততক্ষণ আমার অন্য কোনও ঘোষণা করার দরকার পড়েনি নির্ভরতা। কৌণিক-বীজ প্রকল্পের টেম্পলেটটি এ ক্ষেত্রে বেশ বিভ্রান্তিকর
ক্রিসডেভো

4
এখন আমি সত্যিই বিভ্রান্ত। আমি ফিরে গেছেন এবং বিশ্ব Var মুছে myApp, যাতে এটি এখন একটি বেনামী মডিউল app.js: angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers']);। অন্যান্য সমস্ত ফাইলগুলিতে আমি এর মতো বেনামে মডিউলও ঘোষণা করেছিলাম angular.module('myApp.filter', []).filter('myFilter', function(MyService) { /* filter code */ });। আমার অ্যাপ্লিকেশনটি এখন এটির মতোও কাজ করে। আমি আমার কোডের ইতিহাসটি পেরিয়ে গিয়েছি এবং আমি এটি দেখতে পাচ্ছি না যে এটি যখন কাজ না করে তখন আমার চেয়ে আলাদা এটি কোথায়।
ক্রিসডেভো

4
আমি আপনাকে এই কাজ প্রতিশ্রুতি। আমি একে একে অ্যাঙ্গুলার অ্যাপ্লিকেশন বিকাশ করে প্রতিদিন ব্যবহার করি। আবার, angular.module('myApp', []);আমার প্রধান জেএস ফাইলটিতে আমার একটি বর্গাকার বন্ধনী লক্ষ্য করুন rac তারপরে, অন্যান্য সমস্ত ফাইল মেন্যুয়ালকে সিন্ট্যাক্স angular.module('myApp').controllerবা .directiveসিনট্যাক্স ব্যবহার করে উল্লেখ করে ।
জাস্টিন এল।

5
ত্রুটিগুলি ঘটায় কারণ অ্যাঙ্গুলারটি মাইপ অ্যাপন্ট্রোলার, মাইএপ.ফিল্টার নামে পরিচিত মডিউলগুলি সন্ধান করছে ... তবে, সেগুলি মডিউল নয়, তারা মাইপ অ্যাপ্লিকেশন নামে একটি মডিউল প্রসারিত উপাদান components আপনার মডিউল নির্ভরতা থেকে যদি আপনি আপনার সমস্ত মাই অ্যাপ.ও যে কোনও কিছু সরিয়ে ফেলেন তবে সবকিছুই কাজ করা উচিত। শুধু বর্গাকার বন্ধনী খালি রাখা (যতক্ষণ না আপনি, অন্যান্য সত্য কৌণিক মডিউল সহ যেমন ngCookies, ngResource) যখন আপনার প্রধান অ্যাপ্লিকেশন মডিউল ঘোষণা:angular.module('myApp', []);
জাস্টিন এল

4
আহ ঠিক আছে. আপনার অ্যাপ মডিউলের জন্য নির্ভরশীলতার হিসাবে যারা স্থাপন করে, এটি ভুল হবে কারণ এটি হয়েছে তাদের খুঁজে বের করতে। আপনি যদি এগুলি স্কোয়ার ব্র্যাকেটগুলির বাইরে নিয়ে যান তবে আপনি ইচ্ছামতো এগুলি লোড করতে পারেন এবং আপনার অ্যাপ্লিকেশনটির কোনও যত্ন নেই। ngResourceআপনি আপনার মডিউল ঘোষণা ব্র্যাকেটে অবশ্যই রাখেন তাদের মধ্যে একটি অবশ্যই definitely যদি আমার উত্তরটি সহায়তা করে, ভোট দেওয়া এবং এটি অনুমোদিত করা অনেক প্রশংসাযোগ্য।
জাস্টিন এল।

12

আপনি যদি নিজের অ্যাপ্লিকেশনের বিভিন্ন অংশ ( filters, services, controllers) বিভিন্ন শারীরিক ফাইলে রাখতে চান তবে দুটি জিনিস আপনাকে করতে হবে:

  1. আপনার app.jsবা প্রতিটি ফাইলে সেই নামের স্থানগুলি (আরও ভাল শর্তের অভাবে) ঘোষণা করুন;
  2. প্রতিটি ফাইলের সেই নেমস্পেসগুলি দেখুন।

সুতরাং, আপনার app.jsমত দেখতে হবে:

angular.module('myApp', ['external-dependency-1', 'myApp.services', 'myApp.controllers'])
.run(function() {
   //...

})
.config(function() {
  //...
});

এবং প্রতিটি স্বতন্ত্র ফাইলে:

services.js

angular.module('myApp.services', []); //instantiates
angular.module('myApp.services') //gets
.factory('MyService', function() { 
  return {};
});

controllers.js

angular.module('myApp.controllers', []); //instantiates
angular.module('myApp.controllers')      //gets
.controller('MyCtrl', function($scope) {
  //snip...
})
.controller('AccountCtrl', function($scope) {
  //snip...
});

এই সমস্তগুলিকে একটি কলে একত্রিত করা যেতে পারে:

controllers.js
angular.module('myApp.controllers', []) 
.controller('MyCtrl', function($scope) {
 //snip...
});    

গুরুত্বপূর্ণ অংশটি হ'ল আপনার নতুন সংজ্ঞা দেওয়া উচিত নয় angular.module('myApp'); আপনি যখন আপনার কন্ট্রোলারদের ইনস্ট্যান্ট করবেন তখন এটি ওভাররাইট হয়ে যাবে, সম্ভবত আপনি যা চান তা নয় not


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

আমার কাছে যদি দুটি কন্ট্রোলার ফাইল বা দুটি পরিষেবা ফাইল থাকে? প্রতিটি একক ফাইলের জন্য কি ইনস্ট্যানিয়েটটি ঘটবে?
অবিনাশ রাজ

3

আপনি ত্রুটি পেয়েছেন কারণ আপনি myApp.servicesএখনও সংজ্ঞায়িত করেন নি। আমি এ পর্যন্ত যা করেছি তা হ'ল সমস্ত প্রাথমিক সংজ্ঞা একটি ফাইলে রাখা এবং তারপরে সেগুলিতে অন্যটিতে ব্যবহার করা। আপনার উদাহরণের মত আমি এই লিখতে হবে:

app.js

angular.module('myApp.services', []);

angular.module('myApp', 
    ['myApp.services',
      ...]);

এটির ত্রুটি থেকে মুক্তি পাওয়া উচিত, যদিও আমি মনে করি আপনার এডওয়ার্ড গামোনাল প্রবন্ধটি একটি মন্তব্যে উল্লিখিত হওয়া উচিত ।


ধন্যবাদ, টর্স্টেন, তবে আমি সেই নিবন্ধটি পড়েছি এবং angular.module('myApp.services', []);আমার অ্যাপ.জেএস ফাইলটিতে লাইনটি যুক্ত করেছি । সত্যই আমার সমস্যা সমাধান করে না।
ক্রিসডেভো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.