Angular.js: কীভাবে $ eval কাজ করে এবং কেন এটি ভ্যানিলা ইওল থেকে আলাদা?


151

আমি $scope.$evalআপনার সম্পর্কে কৌতূহল ছিলাম যেহেতু প্রায়শই নির্দেশিকাতে দেখি, তাই উত্সটি পরীক্ষা করে দেখেছি এবং নীচেরগুলিতে খুঁজে পেয়েছি rootScope.js:

  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$parseParseProviderইন দ্বারা সংজ্ঞায়িত করা দেখা যায় parse.js, যা এটির নিজস্ব একধরণের মিনি সিনট্যাক্স সংজ্ঞায়িত করতে দেখা যায় (ফাইলটি 900 লাইন দীর্ঘ)।

আমার প্রশ্নগুলি হ'ল:

  1. ঠিক কী $evalকরছে? কেন এটির নিজস্ব মিনি পার্সিং ভাষার প্রয়োজন?

  2. সরল পুরানো জাভাস্ক্রিপ্ট কেন evalব্যবহার হচ্ছে না ?


13
al বর্তমানের ক্ষেত্রের বিপরীতে / বিপরীতে একটি কৌণিক অভিব্যক্তি মূল্যায়ন করে
মার্ক রাজকোক

4
বিটিডাব্লু $parseঅত্যন্ত উন্মত্ত।
ফ্রেশিয়েবল

উত্তর:


186

$evalএবং $parseজাভাস্ক্রিপ্ট মূল্যায়ন করবেন না; তারা AngularJS এক্সপ্রেশন মূল্যায়ন । লিঙ্কযুক্ত ডকুমেন্টেশন এক্সপ্রেশন এবং জাভাস্ক্রিপ্ট মধ্যে পার্থক্য ব্যাখ্যা করে।

প্রশ্ন: $ eval কি করছে? কেন এটির নিজস্ব মিনি পার্সিং ভাষার প্রয়োজন?

ডক্স থেকে:

এক্সপ্রেশনগুলি জাভাস্ক্রিপ্টের মতো কোড স্নিপেট যা সাধারণত b b এক্সপ্রেশন} as এর মতো বাইন্ডিংগুলিতে স্থাপন করা হয়} এক্সপ্রেশন সার্ভিস দ্বারা এক্সপ্রেশনগুলি প্রক্রিয়া করা হয়।

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

প্রশ্ন: কেন সরল পুরাতন জাভাস্ক্রিপ্ট "ইওল" ব্যবহার হচ্ছে না?

কারণ এটি আসলে জাভাস্ক্রিপ্ট মূল্যায়ন করছে না। যেমন ডকস বলেছেন:

যদি ... আপনি যথেচ্ছ জাভাস্ক্রিপ্ট কোড চালাতে চান, আপনার এটিকে একটি নিয়ামক পদ্ধতি তৈরি করা উচিত এবং পদ্ধতিটি কল করা উচিত। আপনি যদি জাভাস্ক্রিপ্ট থেকে একটি কৌণিক অভিব্যক্তি () প্রকাশ করতে চান তবে $ eval () পদ্ধতিটি ব্যবহার করুন।

উপরে লিঙ্কযুক্ত দস্তাবেজের আরও অনেক তথ্য রয়েছে।


আপনি বলেছেন $ eval আসলে জাভাস্ক্রিপ্টের মূল্যায়ন করছে না তবে আমি যদি $ eval ("{id: 'val'}") করি তবে আমি একটি জেএস বিষয়বস্তু পাই। (কৌণিক 1.0.8)
গ্যাব্রিয়েল

7
@ ইয়াপলি $evalজাভাস্ক্রিপ্ট মূল্যায়ন করে না; এটি অ্যাঙ্গুলারজেএস এক্সপ্রেশনগুলি মূল্যায়ন করে, যা জাভাস্ক্রিপ্টের নিরাপদ উপসেটের মতো। "{id: 'val'}"এটি একটি বৈধ AngularJS এক্সপ্রেশন এবং একটি বৈধ জেএস বস্তুটি ফিরিয়ে আনা উচিত। এক্সপ্রেশন এবং নিয়মিত জেএসের মধ্যে পার্থক্যের জন্য উপরের লিঙ্কটি দেখুন।
জোশ ডেভিড মিলার

1
উত্তম উত্তর তবে আমি নিশ্চিত না যে "উদাহরণস্বরূপ কোনও নিয়ন্ত্রণ প্রবাহের বিবৃতি" সঠিক নয়। আপনি এর মতো কিছু করতে পারেন ... এনজি-ক্লিক = "কিছুভ্যাল? কিছুফঙ্ক (কিছু কিছু): নুপ" যা পুরোপুরি বৈধ কৌণিক অভিব্যক্তি
চার্লি মার্টিন

@ চর্লিমার্টিন ডকুমেন্টেশনে বিশেষত "কোনও নিয়ন্ত্রণ প্রবাহের বিবৃতি নেই" বলা হয়েছে , তবে আপনার বিষয়টি বৈধ। যাইহোক, আমি অবশ্যই একটি এনজি-ক্লিকে এমনটি করার সুপারিশ করব না; এই জাতীয় যুক্তি প্রায় অবশ্যই নিয়ামকের অন্তর্ভুক্ত।
জোশ ডেভিড মিলার

1
মজাদার বিষয় যে ডকস বলেছেন যে ত্রিশটি অপারেটরের সমর্থন হিসাবে ইচ্ছাকৃতভাবে যুক্ত করা হয়েছিল ... github.com/angular/angular.js/blob/master/src/ng/… এনজি-ক্লিক কেবল একটি সহজ উদাহরণ ছিল এবং আমি সম্মত এই যুক্তিটি একটি নিয়ামকের মধ্যে থাকা উচিত, তবে আমি বন্ধনীর স্বরলিখনের মধ্যে একটি টার্নারি অপারেটর ব্যবহার করে কোনও ভুল দেখতে পাচ্ছি না এবং কৌণিক দলটি স্পষ্টতই হয় না বা তারা এটির জন্য সমর্থন যোগ করতে পারে না। আমি মনে করি যদি কোনও সংশোধন করা হয়, তবে এই উত্তরটির আগে ডক্সে এটি হওয়া উচিত
চার্লি মার্টিন

22

পরীক্ষা থেকে,

it('should allow passing locals to the expression', inject(function($rootScope) {
  expect($rootScope.$eval('a+1', {a: 2})).toBe(3);

  $rootScope.$eval(function(scope, locals) {
    scope.c = locals.b + 4;
  }, {b: 3});
  expect($rootScope.c).toBe(7);
}));

আমরা মূল্যায়নের প্রকাশের জন্য স্থানীয়দেরও পাস করতে পারি।


2

আমি মনে করি এখানে মূল প্রশ্নের একটির উত্তর দেওয়া হয়নি। আমি বিশ্বাস করি যে ভ্যানিলা ইয়াল () ব্যবহার করা হয় নি কারণ তখন কৌণিক অ্যাপ্লিকেশনগুলি Chrome অ্যাপ্লিকেশন হিসাবে কাজ করবে না, যা স্পষ্টভাবে সুরক্ষার কারণে ওয়াল () ব্যবহার করা থেকে বিরত করে।

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