কৌণিক জেএস: পিতামাতার স্কোপে শিশু স্কোপ ফাংশনটিকে কীভাবে কল করা যায়


95

সন্তানের স্কোপে সংজ্ঞায়িত কোনও পদ্ধতিটিকে তার পিতামাতার সুযোগ থেকে কীভাবে কল করতে পারেন?

function ParentCntl() {
    // I want to call the $scope.get here
}

function ChildCntl($scope) {
    $scope.get = function() {
        return "LOL";    
    }
}

http://jsfiddle.net/wUPdW/


4
সেরা বাজি, একটি পরিষেবা সংজ্ঞায়িত করুন, পরিষেবাটি উভয় নিয়ামককে ইনজেক্ট করুন। অথবা রুটস্কোপ ব্যবহার করুন।
tymeJV

উত্তর:


146

আপনি $broadcastসন্তানের কাছে পিতামাতার কাছ থেকে ব্যবহার করতে পারেন :

function ParentCntl($scope) {

    $scope.msg = "";
    $scope.get = function(){
        $scope.$broadcast ('someEvent');
        return  $scope.msg;        
    }
}

function ChildCntl($scope) {               
    $scope.$on('someEvent', function(e) {  
        $scope.$parent.msg = $scope.get();            
    });

    $scope.get = function(){
        return "LOL";    
    }
}

ওয়ার্ডিং ফিডল: http://jsfiddle.net/wUPdW/2/

আপডেট : আরও একটি সংস্করণ রয়েছে, কম মিলিত এবং আরও পরীক্ষামূলক:

function ParentCntl($scope) {
    $scope.msg = "";
    $scope.get = function(){
        $scope.$broadcast ('someEvent');
        return  $scope.msg;        
    }

    $scope.$on('pingBack', function(e,data) {  
        $scope.msg = data;        
    });
}

function ChildCntl($scope) {               
    $scope.$on('someEvent', function(e) {  
        $scope.$emit("pingBack", $scope.get());        
    });

    $scope.get = function(){
        return "LOL";    
    }
}

ফিডল: http://jsfiddle.net/uypo360u/


যে বেশ শান্ত! তবে, আপনি যদি জানতে চান না (কল করতে চান) কোথায় আছেন (আমি বলতে চাইছি $scope.$parentবা এর মধ্যে আছে $scope.$parent.$parentইত্যাদি)? আহ, হ্যাঁ: প্যারামগুলিতে একটি কলব্যাক পাস করুন! :)
ব্যবহারকারী 2173353

@ ইউজার2173353 আপনি ঠিক বলেছেন; আরও একটি উপায় আছে: $emitএকটি শিশু থেকে পিতামাতার কাছে। আমি আমার উত্তর আপডেট করার সময় বলে মনে করি ..
ইভান চেরনিখ

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

@ ক্যালম্বার্ড, প্রতিটি জিনিস অবশ্যই যত্ন সহকারে ব্যবহার করা উচিত, এটি অবশ্যই নিশ্চিত .. কেউ কেউ অনুরূপ ক্ষেত্রে পরিষেবা ব্যবহার করা পছন্দ করে। যাইহোক, আমি আরও মার্জিত সংস্করণ জুড়েছি ( $parent
বিরক্তি

9
এই পদ্ধতির পরিষ্কার। একটি কলব্যাক পাস করুন $broadcastএবং আপনি pingBackসম্পূর্ণরূপে মুছে ফেলতে পারেন ।
poshest

35

আমাকে আরও একটি সমাধান প্রস্তাব দিন:

var app = angular.module("myNoteApp", []);


app.controller("ParentCntl", function($scope) {
    $scope.obj = {};
});

app.controller("ChildCntl", function($scope) {
    $scope.obj.get = function() {
            return "LOL";    
    };
});

কম কোড এবং প্রোটোটাইপিকাল উত্তরাধিকার ব্যবহার করে।

নিমজ্জিত


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

4
আমি যা বলেছিলাম তা সম্পূর্ণরূপে সত্য নয়। আপনি যা বলেছিলেন সে সম্পর্কে আপনি সঠিক: স্কোপ উত্তরাধিকার কেবলমাত্র এক দিকেই প্রয়োগ করা হয় .... শিশু -> পিতামাতার। এখানে আসলে যা ঘটছে তা হ'ল আপনি যদি শিশু স্কোপ-স্কোপ.গেটকে সংজ্ঞায়িত করেন তবে 'গেট' কেবলমাত্র শিশু স্কোপে সংজ্ঞায়িত করা হবে (কখনও কখনও আদিম সংজ্ঞা হিসাবে পরিচিত)। তবে আপনি যখন। সুযোগ.obj.get সংজ্ঞায়িত করেন, তখন সন্তানের সুযোগটি পিতামাতার স্কোপে সংজ্ঞায়িত এমন বিষয়টির সন্ধান করবে যা শ্রেণিবদ্ধ up
ক্যান্টচিট

4
সন্তানের নিজস্ব বিচ্ছিন্ন সুযোগ থাকলে কীভাবে এই কাজ করবে?
দিনেশ

4
প্রশ্নটি বিচ্ছিন্ন সুযোগের কথা উল্লেখ করছে না, তবে আপনার যদি বিচ্ছিন্ন সুযোগ থাকে তবে আপনি বিচ্ছিন্ন স্কোপ বাইন্ডিং ব্যবহার করতে পারেন। ইমো, সম্প্রচার কিছুটা অগোছালো।
ক্যান্টচিট

4
টেম্পলেট নয়, পিতা-মাতার নিয়ন্ত্রণকারীর কাছ থেকে আপনার সন্তানের নিয়ন্ত্রকের ক্রিয়াকলাপটি অ্যাক্সেস করার প্রয়োজন হলে এই উদাহরণটি সম্ভব বলে আমি মনে করি না। এই উদাহরণটি কেবলমাত্র টেমপ্লেটে দ্বি-মুখী আবদ্ধ হওয়ার কারণে কাজ করে যা আমি ধরে নিয়েছি $scope.obj.get()বৈধ ফাংশন না হওয়া পর্যন্ত পোলিং রাখবে keeps
danyim

12

বাচ্চা শুরু করার সময় পিতামাতার উপর সন্তানের ক্রিয়াকলাপটি নিবন্ধ করুন আমি টেমপ্লেটে স্বচ্ছতার জন্য "হিসাবে" স্বরলিপি ব্যবহার করেছি।

টেমপ্লেট

<div ng-controller="ParentCntl as p">
  <div ng-controller="ChildCntl as c" ng-init="p.init(c.get)"></div>
</div>

নিয়ন্ত্রণকারী

...
function ParentCntl() {
  var p = this;
  p.init = function(fnToRegister) {
    p.childGet = fnToRegister;
  };
 // call p.childGet when you want
}

function ChildCntl() {
  var c = this;
  c.get = function() {
    return "LOL";    
  };
}

"তবে", আপনি বলেছেন, " ng-init এইভাবে ব্যবহার করার কথা নয় !"। ঠিক আছে, তবে, কিন্তু

  1. যে ডকুমেন্টেশন ব্যাখ্যা দেয় না কেন, এবং
  2. আমি বিশ্বাস করি না যে ডকুমেন্টেশন লেখকরা এটির জন্য সমস্ত সম্ভাব্য ব্যবহারের কেস বিবেচনা করেছেন।

আমি বলি এটি এটির জন্য ভাল ব্যবহার। আপনি যদি আমাকে হতাশ করতে চান, কারণ সঙ্গে মন্তব্য করুন! :)

আমি এই পদ্ধতির পছন্দ করি কারণ এটি উপাদানগুলি আরও মডিউল করে রাখে। কেবলমাত্র বাইন্ডিংগুলি টেমপ্লেটে রয়েছে এবং এর অর্থ

  • শিশু কন্ট্রোলার কোন বস্তুটির ক্রিয়াকলাপটি যুক্ত করতে হবে তা সম্পর্কে কিছু জানতে হবে না (@ ক্যান্টচাইচের উত্তর হিসাবে)
  • অভিভাবকীয় নিয়ন্ত্রণটি অন্য কোনও শিশু নিয়ন্ত্রণের সাথে ব্যবহার করা যেতে পারে যার একটি গেম ফাংশন রয়েছে
  • ব্রডকাস্টিংয়ের প্রয়োজন হয় না, যা আপনি ইভেন্টের নেমস্পেসটিকে দৃly়ভাবে নিয়ন্ত্রণ না করে একটি বড় অ্যাপ্লিকেশনটিতে খুব কুৎসিত হয়ে উঠবে

এই পদ্ধতির দিকনির্দেশনা দিয়ে মডুলারাইজ করার টেরোর ধারণার আরও ঘনিষ্ঠভাবে পৌঁছেছে (দ্রষ্টব্য যে তার পরিবর্তিত উদাহরণে, contestantsপিতামাতার কাছ থেকে নমুনায় "শিশু" নির্দেশিকাতে পাঠানো হয়েছে)।

প্রকৃতপক্ষে আরেকটি সমাধান হতে পারে ChildCntlনির্দেশকে বাস্তবায়ন করার বিষয়টি বিবেচনা করা এবং পদ্ধতিটি &নিবন্ধ করার জন্য বাধ্যতামূলক ব্যবহার করা init


4
আমি জানি এটি একটি পুরানো পোস্ট, তবে এটি একটি খারাপ ধারণা বলে মনে হচ্ছে কারণ সন্তান নষ্ট হওয়ার পরে পিতামাতারা সন্তানের একটি উল্লেখ রাখতে পারেন।
অ্যামি ব্লাকেনশিপ

এটি ব্রডকাস্ট ইভেন্টগুলির তুলনায় অনেক পরিষ্কার সমাধান। নিখুঁত নয়, তবে আরও ভাল। যদিও পরিষ্কার-পরিচ্ছন্নতা আসলে একটি বিষয়।
এমসিভি

-1

আপনি শিশুকে আপত্তি করতে পারেন।

var app = angular.module("myApp", []);


app.controller("ParentCntl", function($scope) {
    $scope.child= {};
    $scope.get = function(){
      return $scope.child.get(); // you can call it. it will return 'LOL'
    }
   // or  you can call it directly like $scope.child.get() once it loaded.
});

app.controller("ChildCntl", function($scope) {
    $scope.obj.get = function() {
            return "LOL";    
    };
});

এখানে শিশুটি পদ্ধতির গন্তব্য প্রমাণ করছে।

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