আমার তিনটি নিয়ামক রয়েছে যা বেশ অনুরূপ। আমি একটি নিয়ামক রাখতে চাই যা এই তিনটি এর ক্রিয়াকলাপগুলি প্রসারিত এবং ভাগ করে।
আমার তিনটি নিয়ামক রয়েছে যা বেশ অনুরূপ। আমি একটি নিয়ামক রাখতে চাই যা এই তিনটি এর ক্রিয়াকলাপগুলি প্রসারিত এবং ভাগ করে।
উত্তর:
সম্ভবত আপনি কোনও নিয়ামক প্রসারিত করেন না তবে একটি নিয়ামক প্রসারিত করা বা একক নিয়ামককে একাধিক নিয়ামকের মিশ্রণ তৈরি করা সম্ভব।
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
// Initialize the super class and extend it.
angular.extend(this, $controller('CtrlImpl', {$scope: $scope}));
… Additional extensions to create a mixin.
}]);
যখন প্যারেন্ট কন্ট্রোলার তৈরি হয় তখন এর মধ্যে থাকা লজিকটিও কার্যকর হয়। আরও তথ্যের জন্য See নিয়ামক () দেখুন তবে কেবল $scope
মানটি পাস করতে হবে। অন্যান্য সমস্ত মানগুলি সাধারণত ইনজেকশন দেওয়া হবে।
@ মাওয়ারেন , আপনার উদ্বেগটি কৌণিক নির্ভরতা ইনজেকশন দ্বারা অটো- ম্যাজিকালি যত্ন নেওয়া হয়। আপনার কেবলমাত্র স্কোপ ইনজেকশন করা দরকার, যদিও আপনি চাইলে অন্যান্য ইনজেকশনের মানগুলি ওভাররাইড করতে পারেন। নিম্নলিখিত উদাহরণটি ধরুন:
(function(angular) {
var module = angular.module('stackoverflow.example',[]);
module.controller('simpleController', function($scope, $document) {
this.getOrigin = function() {
return $document[0].location.origin;
};
});
module.controller('complexController', function($scope, $controller) {
angular.extend(this, $controller('simpleController', {$scope: $scope}));
});
})(angular);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.js"></script>
<div ng-app="stackoverflow.example">
<div ng-controller="complexController as C">
<span><b>Origin from Controller:</b> {{C.getOrigin()}}</span>
</div>
</div>
যদিও complex ডকুমেন্টটি 'কমপ্লেক্সকন্ট্রোলার' দ্বারা তৈরি করা হয় তখন সেটিকে 'সিম্পল কন্ট্রোলার'-এ প্রেরণ করা হয় না $ নথিটি আমাদের জন্য ইনজেকশনের পরে তৈরি করা হয়।
$.extend()
$controller('CtrlImpl', {$scope: $scope});
angular.extend
(বা $.extend
) আসলে $scope
একমাত্র প্রসারিত করার অর্থ , তবে যদি আপনার বেস কন্ট্রোলার কিছু বৈশিষ্ট্য (উদাহরণস্বরূপ this.myVar=5
) ও সংজ্ঞায়িত করে থাকে তবে ব্যবহার করার সময় আপনার কেবলমাত্র this.myVar
প্রসারিত নিয়ন্ত্রকের অ্যাক্সেস থাকতে হবেangular.extend
handleSubmitClick
যা ডাকে handleLogin
যা পরিবর্তিতভাবে একটি loginSuccess
এবং ছিল loginFail
। সুতরাং, আমার বর্ধিত নিয়ামক মধ্যে আমি তখন জমিদার ছিল handleSubmitClick
, handleLogin
এবং loginSucess
সঠিক জন্য loginSuccess
ফাংশন ব্যবহৃত হবে।
উত্তরাধিকারের জন্য আপনি মানক জাভাস্ক্রিপ্ট উত্তরাধিকারের ধরণগুলি ব্যবহার করতে পারেন। এখানে একটি ডেমো যা ব্যবহার করে is$injector
function Parent($scope) {
$scope.name = 'Human';
$scope.clickParent = function() {
$scope.name = 'Clicked from base controller';
}
}
function Child($scope, $injector) {
$injector.invoke(Parent, this, {$scope: $scope});
$scope.name = 'Human Child';
$scope.clickChild = function(){
$scope.clickParent();
}
}
Child.prototype = Object.create(Parent.prototype);
আপনি যদি controllerAs
সিনট্যাক্সটি ব্যবহার করেন (যা আমি অত্যন্ত সুপারিশ করি) তবে শাস্ত্রীয় উত্তরাধিকারের ধরণটি ব্যবহার করা আরও সহজ:
function BaseCtrl() {
this.name = 'foobar';
}
BaseCtrl.prototype.parentMethod = function () {
//body
};
function ChildCtrl() {
BaseCtrl.call(this);
this.name = 'baz';
}
ChildCtrl.prototype = Object.create(BaseCtrl.prototype);
ChildCtrl.prototype.childMethod = function () {
this.parentMethod();
//body
};
app.controller('BaseCtrl', BaseCtrl);
app.controller('ChildCtrl', ChildCtrl);
আর একটি উপায় হতে পারে কেবল "বিমূর্ত" কনস্ট্রাক্টর ফাংশন তৈরি করা যা আপনার বেস নিয়ামক হবে:
function BaseController() {
this.click = function () {
//some actions here
};
}
module.controller('ChildCtrl', ['$scope', function ($scope) {
BaseController.call($scope);
$scope.anotherClick = function () {
//other actions
};
}]);
ঠিক আছে, আপনি কী অর্জন করতে চান তা আমি নিশ্চিত নই, তবে সাধারণত পরিষেবাগুলিই যাওয়ার উপায়। আপনি কন্ট্রোলারের মধ্যে কোড ভাগ করতে কৌণিকের স্কোপের উত্তরাধিকার বৈশিষ্ট্যগুলিও ব্যবহার করতে পারেন:
<body ng-controller="ParentCtrl">
<div ng-controller="FirstChildCtrl"></div>
<div ng-controller="SecondChildCtrl"></div>
</body>
function ParentCtrl($scope) {
$scope.fx = function() {
alert("Hello World");
});
}
function FirstChildCtrl($scope) {
// $scope.fx() is available here
}
function SecondChildCtrl($scope) {
// $scope.fx() is available here
}
$scope.$parent.fx( )
খুব পরিষ্কার উপায় হবে না, যেহেতু এটিই এখানে সংজ্ঞায়িত হয়েছে?
আপনি নিয়ন্ত্রকদের প্রসারিত করবেন না। যদি তারা একই বেসিক ফাংশন সম্পাদন করে তবে সেই ফাংশনগুলিকে একটি পরিষেবায় স্থানান্তরিত করা দরকার। এই পরিষেবাটি আপনার নিয়ামকদের মধ্যে ইনজেকশনের ব্যবস্থা করা যেতে পারে।
এই নিবন্ধ থেকে নেওয়া আরও একটি ভাল সমাধান :
// base controller containing common functions for add/edit controllers
module.controller('Diary.BaseAddEditController', function ($scope, SomeService) {
$scope.diaryEntry = {};
$scope.saveDiaryEntry = function () {
SomeService.SaveDiaryEntry($scope.diaryEntry);
};
// add any other shared functionality here.
}])
module.controller('Diary.AddDiaryController', function ($scope, $controller) {
// instantiate base controller
$controller('Diary.BaseAddEditController', { $scope: $scope });
}])
module.controller('Diary.EditDiaryController', function ($scope, $routeParams, DiaryService, $controller) {
// instantiate base controller
$controller('Diary.BaseAddEditController', { $scope: $scope });
DiaryService.GetDiaryEntry($routeParams.id).success(function (data) {
$scope.diaryEntry = data;
});
}]);
আপনি কোনও সার্ভিস তৈরি করতে পারেন এবং কেবল ইনজেকশনের মাধ্যমে কোনও নিয়ন্ত্রণকারীর মধ্যে এর আচরণের উত্তরাধিকারী হতে পারেন।
app.service("reusableCode", function() {
var reusableCode = {};
reusableCode.commonMethod = function() {
alert('Hello, World!');
};
return reusableCode;
});
তারপরে আপনার নিয়ামকটিতে আপনি উপরের পুনঃব্যবহারযোগ্য কোড পরিষেবা থেকে প্রসারিত করতে চান:
app.controller('MainCtrl', function($scope, reusableCode) {
angular.extend($scope, reusableCode);
// now you can access all the properties of reusableCode in this $scope
$scope.commonMethod()
});
ডেমো প্লানকার: http://plnkr.co/edit/EQtj6I0X08xprE8D0n5b?p= পূর্বরূপ
আপনি এরকম কিছু চেষ্টা করতে পারেন (পরীক্ষা করেননি):
function baseController(callback){
return function($scope){
$scope.baseMethod = function(){
console.log('base method');
}
callback.apply(this, arguments);
}
}
app.controller('childController', baseController(function(){
}));
আপনি কোনও পরিষেবা , কারখানা বা সরবরাহকারী দিয়ে প্রসারিত করতে পারেন । তারা একই তবে নমনীয়তার বিভিন্ন ডিগ্রি সহ।
কারখানাটি ব্যবহার করে এখানে একটি উদাহরণ রয়েছে: http://jsfiddle.net/aaaflyvw/6KVtj/2/
angular.module('myApp',[])
.factory('myFactory', function() {
var myFactory = {
save: function () {
// saving ...
},
store: function () {
// storing ...
}
};
return myFactory;
})
.controller('myController', function($scope, myFactory) {
$scope.myFactory = myFactory;
myFactory.save(); // here you can use the save function
});
এবং এখানে আপনি স্টোর ফাংশনটিও ব্যবহার করতে পারেন:
<div ng-controller="myController">
<input ng-blur="myFactory.store()" />
</div>
আপনি সরাসরি $ নিয়ামক ('প্যারেন্টকন্ট্রোলার', {$ সুযোগ: $ সুযোগ}) উদাহরণ ব্যবহার করতে পারেন
module.controller('Parent', ['$scope', function ($scope) {
//code
}])
module.controller('CtrlImplAdvanced', ['$scope', '$controller', function ($scope, $controller) {
//extend parent controller
$controller('CtrlImpl', {$scope: $scope});
}]);
আপনি সরল জাভাস্ক্রিপ্ট উত্তরাধিকারের সাথে মিলিয়ে অ্যাঙ্গুলার "হিসাবে" সিনট্যাক্স ব্যবহার করতে পারেন
এখানে আরও বিশদ দেখুন http://blogs.microsoft.co.il/oric/2015/01/01/base-controller-angularjs/
আমি এটি করতে একটি ফাংশন লিখেছি:
function extendController(baseController, extension) {
return [
'$scope', '$injector',
function($scope, $injector) {
$injector.invoke(baseController, this, { $scope: $scope });
$injector.invoke(extension, this, { $scope: $scope });
}
]
}
আপনি এটি এর মতো ব্যবহার করতে পারেন:
function() {
var BaseController = [
'$scope', '$http', // etc.
function($scope, $http, // etc.
$scope.myFunction = function() {
//
}
// etc.
}
];
app.controller('myController',
extendController(BaseController,
['$scope', '$filter', // etc.
function($scope, $filter /* etc. */)
$scope.myOtherFunction = function() {
//
}
// etc.
}]
)
);
}();
পেশাদাররা:
কনস:
আমি নিয়ন্ত্রণকারীদের প্রসারিতকে খারাপ অভ্যাস হিসাবে বিবেচনা করি। বরং আপনার ভাগ করা যুক্তি একটি পরিষেবাতে রাখুন। জাভাস্ক্রিপ্টে প্রসারিত অবজেক্টগুলি বরং জটিল হওয়ার প্রবণতা দেখায়। আপনি যদি উত্তরাধিকার ব্যবহার করতে চান তবে আমি টাইপস্ক্রিপ্টের পরামর্শ দেব। তবুও, আমার দৃষ্টিকোণে যাওয়ার জন্য পাতলা নিয়ন্ত্রণকারীরা আরও ভাল উপায়।