অ্যাঙ্গুলারজেস-স্কোপ এ ডায়নামিক স্কোপ ভেরিয়েবল সেট করা হচ্ছে <<সোম_ স্ট্রিং>


97

আমার কাছে একটি স্ট্রিং আছে যা আমি routeParamএকটি নির্দেশিকা গুণ বা যা কিছু থেকে পেয়েছি এবং আমি এর ভিত্তিতে স্কোপটিতে একটি পরিবর্তনশীল তৈরি করতে চাই। সুতরাং:

$scope.<the_string> = "something".

তবে স্ট্রিংয়ে যদি এক বা একাধিক বিন্দু থাকে তবে আমি এটিকে বিভক্ত করতে চাই এবং আসলে সুযোগটিতে "ড্রিল ডাউন" করতে চাই। তাই 'foo.bar'হয়ে উঠতে হবে $scope.foo.bar। এর অর্থ হল যে সহজ সংস্করণটি কাজ করবে না!

// This will not work as assigning variables like this will not "drill down"
// It will assign to a variables named the exact string, dots and all.
var the_string = 'life.meaning';
$scope[the_string] = 42;
console.log($scope.life.meaning);  // <-- Nope! This is undefined.
console.log($scope['life.meaning']);  // <-- It is in here instead!

কোনও স্ট্রিংয়ের উপর ভিত্তি করে ভেরিয়েবলটি পড়ার সময় আপনি এই আচরণটি করে তা পেতে পারেন $scope.$eval(the_string), তবে কোনও মূল্য নির্ধারণের সময় এটি কীভাবে করবেন?

উত্তর:


174

আমি যে সমাধানটি পেয়েছি তা হ'ল পার্স ব্যবহার করা ।

"কৌণিক অভিব্যক্তিকে একটি ক্রিয়ায় রূপান্তর করে" "

কারও যদি এর চেয়ে ভাল থাকে তবে দয়া করে প্রশ্নের নতুন উত্তর যুক্ত করুন!

এখানে উদাহরণ:

var the_string = 'life.meaning';

// Get the model
var model = $parse(the_string);

// Assigns a value to it
model.assign($scope, 42);

// Apply it to the scope
// $scope.$apply(); <- According to comments, this is no longer needed

console.log($scope.life.meaning);  // logs 42

4
সুতরাং এটি সুন্দর! তবে (এবং প্রায় সর্বদা এক থাকে) আমি আমার ডেটা প্রচার করতে $ সুযোগ। প্রয়োগ করতে পারি না। আমি এটি কনসোল লগে দেখতে পাচ্ছি, তবে আমার ভিউ নতুন যুক্ত হওয়া ডেটা দেখায় না (আমার একটি ফুটার বার রয়েছে যেখানে আমি $ সুযোগটি দেখি) - কোনও ধারণা?
উইলিয়াম ই স্ক্রোইডার

কোড না দেখে জানা শক্ত, তবে আমার প্রথম অনুমানটি হ'ল ফুটারটি একই স্কোপে নেই। যদি ফুটারটি এনজি-কন্ট্রোলার = "আপনারকন্ট্রোলার" দিয়ে উপাদানটির বাইরে থাকে তবে এর ভেরিয়েবলগুলিতে এটির অ্যাক্সেস থাকবে না।
এরিক হ্নান

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

4
$ সুযোগ। Is কেন প্রয়োজনীয়?
sinθ

আমি আসলে বেশ স্মরণ করি না। আমি মনে করি কারণ এটি ছিল কারণ মডেল.সাইগান ডেটা বন্ডিং ট্রিগার করে না, তাই আপনাকে যা করতে হবে তা করার পরে আপনাকে নিজেই প্রয়োগ করতে হবে। এটি ব্যবহার করে দেখুন এবং এটি অপসারণ করা সম্ভব কিনা তা দেখুন (অ্যাংুলারের নতুন সংস্করণেও এটি পরিবর্তিত হতে পারে, আমি মনে করি এটি এক বা দুটি সংস্করণ ছিল)।
এরিক হোন

20

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

আমার এনজি-ক্লিক ফাংশনে আমার রয়েছে:

var the_string = 'lifeMeaning';
if ($scope[the_string] === undefined) {
   //Valid in my application for first usage
   $scope[the_string] = true;
} else {
   $scope[the_string] = !$scope[the_string];
}
//$scope.$apply

আমি এটি and সুযোগ। সহ এবং এর বাইরেও পরীক্ষা করেছি। এটি ছাড়া সঠিকভাবে কাজ করে!


13
মনে রাখবেন যে প্রশ্নটি যা আছে তার থেকে এটি সম্পূর্ণ আলাদা। প্রশ্নের লক্ষ্য হ'ল স্ট্রিংয়ের উপর ভিত্তি করে 1 টিরও বেশি গভীরতার সাথে একটি গতিশীল স্কোপ ভেরিয়েবল তৈরি করা। সুতরাং "স্কোপ.লাইফ.মিনিং" তৈরি করতে "স্কোপ.লাইফমিনিং" নয়। $ সুযোগ [the_string] ব্যবহার করলে তা হবে না। এবং আপনার নির্দিষ্ট ক্ষেত্রে, মনে রাখবেন যে অপরিবর্তিত জাভাস্ক্রিপ্টে প্রকৃত সত্য, সুতরাং আপনি যদি বিবৃতিটি পুরোটা এড়িয়ে যেতে পারেন এবং কেবল $ সুযোগ [the_string] =! $ সুযোগ [the_string]; করতে পারেন। কোডটি যদিও খানিকটা ঘোলাটে করে দিতে পারে, তাই আমি নিশ্চিত নই যে এটি সত্যই আপনি চান এমন কিছু কিনা।
এরিক হান

@ এরিকহান, আসলে, $ সুযোগ [Life.meaning] = সত্যই আমার পক্ষে কাজ করেছে!
জেসি পি ফ্রান্সিস

4
এটি "কাজ করে", তবে 1.6-এ কিছু পরিবর্তন না করা যদি না প্রশ্ন জিজ্ঞাসা করে তবে একই কাজ করে না। আপনি যদি $ সুযোগ [Life.meaning] করেন তবে = সম্পত্তিটির সঠিক নাম হবে "Life.meaning", এবং এটি আমরা চাই না। আমরা জীবন নামে একটি সম্পত্তি চাই যার অর্থ নামে একটি শিশু সম্পত্তি রয়েছে।
এরিক হান

13

ফলাফলগুলি থেকে গতিশীল কৌণিক পরিবর্তনশীল তৈরি করুন Create

angular.forEach(results, function (value, key) {          
  if (key != null) {                       
    $parse(key).assign($scope, value);                                
  }          
});

পুনশ্চ. আপনার নিয়ামকের ফাংশনে ars পার্স বৈশিষ্ট্যটি পাস করতে ভুলবেন না


5

আপনি যদি লোডাশ ব্যবহারের ক্ষেত্রে ঠিক থাকেন তবে আপনি _.set () ব্যবহার করে এক লাইনে যা করতে চেয়েছিলেন তা করতে পারেন:

_.set (অবজেক্ট, পাথ, মান) অবজেক্টের পাথের সম্পত্তি সম্পত্তি নির্ধারণ করে। যদি কোনও অংশের অস্তিত্ব না থাকে তবে এটি তৈরি করা হয়েছে।

https://lodash.com/docs#set

সুতরাং আপনার উদাহরণটি সহজভাবে হবে: _.set($scope, the_string, something);


4

কেবলমাত্র উত্তোলিত দেওয়া উত্তরগুলিতে যুক্ত করতে, নিম্নলিখিতগুলি আমার পক্ষে কাজ করেছে:

এইচটিএমএল:

<div id="div{{$index+1}}" data-ng-show="val{{$index}}">

$indexলুপ সূচকটি কোথায় ।

জাভাস্ক্রিপ্ট (যেখানে valueফাংশনটি উত্তীর্ণ প্যারামিটার এবং এটি $indexবর্তমান লুপ সূচকের মান হবে ):

var variable = "val"+value;
if ($scope[variable] === undefined)
{
    $scope[variable] = true;
}else {
    $scope[variable] = !$scope[variable];
}

এই প্রশ্নের সাথে কিছু করার নেই, দয়া করে বিষয়টিতে থাকুন।
এরিক হোন

দুঃখিত, ভেবেছি স্ট্রিংগুলি ব্যবহার করে এটি গতিশীল পরিবর্তনশীল তৈরিতে সহায়তা করতে পারে। এই থ্রেডটি আমাকে উপরের কোডটি লিখতে সহায়তা করেছে যা আমার পক্ষে ভাল কাজ করছে।
রিয়াজ

কোনও উদ্বেগ নেই, উত্তর সরবরাহ করা একটি ভাল শুরু, কেবল প্রথমে প্রশ্নটি পড়ার বিষয়টি নিশ্চিত করুন :) এই ক্ষেত্রে এটি অজানা স্ট্রিংটিকে "abc" অবজেক্টে পার্স করার বিষয়ে {a: {b: {c: ...} }}। তবে পুনরাবৃত্তি আইটেমগুলি পরিচালনা করা একটি সাধারণ সমস্যা তাই আমি খুশি যে আপনি থ্রেডে হেল্পফুলের কিছু পেয়েছেন।
এরিক

ওহ, এবং আমি অন্য উত্তরে যেমন উল্লেখ করেছি, মানগুলি যদি সত্য / মিথ্যা (বা অপরিজ্ঞাত) বলে মনে করা হয় তবে আপনি কেবল পুরো যুক্তিটি এড়িয়ে যেতে পারেন এবং $ সুযোগ [পরিবর্তনশীল] ===! $ সুযোগ [পরিবর্তনশীল] করতে পারেন, অপরিবর্তিত জাভাস্ক্রিপ্টে সত্য। যদিও আপনি টাইপ স্ক্রিপ্ট ব্যবহার করছেন বলে আমার সন্দেহ হয় এটি আপনার উপর ক্ষিপ্ত হয়ে উঠবে!
এরিক

3

দয়া করে মনে রাখবেন: এটি কেবল একটি জাভাস্ক্রিপ্ট জিনিস এবং অ্যাংুলার জেএস এর সাথে কোনও সম্পর্ক নেই। সুতরাং যাদুকরী '$' চিহ্ন সম্পর্কে বিভ্রান্ত হবেন না;)

মূল সমস্যাটি হ'ল এটি একটি শ্রেণিবদ্ধ কাঠামো।

console.log($scope.life.meaning);  // <-- Nope! This is undefined.
=> a.b.c

এটি অপরিজ্ঞাত কারণ "" স্কোপ.লাইফ "বিদ্যমান নেই তবে উপরের শব্দটি" অর্থ "সমাধান করতে চায়।

সমাধান হওয়া উচিত

var the_string = 'lifeMeaning';
$scope[the_string] = 42;
console.log($scope.lifeMeaning);
console.log($scope['lifeMeaning']);

বা আরও কিছুটা সাবলীলভাবে।

var the_string_level_one = 'life';
var the_string_level_two = the_string_level_one + '.meaning';
$scope[the_string_level_two ] = 42;
console.log($scope.life.meaning);
console.log($scope['the_string_level_two ']);

যেহেতু আপনি স্ট্রাকচারাল অবজেক্টের সাথে অ্যাক্সেস করতে পারেন

var a = {};
a.b = "ab";
console.log(a.b === a['b']);

এটি সম্পর্কে বেশ কয়েকটি ভাল টিউটোরিয়াল রয়েছে যা জাভাস্ক্রিপ্টের সাথে মজা করার জন্য আপনাকে গাইড করে।

সম্পর্কে কিছু আছে

$scope.$apply();
do...somthing...bla...bla

'কৌণিক $ প্রয়োগ করুন' এর জন্য ওয়েবে যান এবং আপনি $ প্রয়োগ ফাংশন সম্পর্কিত তথ্য পাবেন। এবং আপনার ব্যবহার করা উচিত এইভাবে বুদ্ধিমানভাবে আরও বেশি (যদি আপনি $ প্রয়োগের পর্বের সাথে যুক্ত না হন)।

$scope.$apply(function (){
    do...somthing...bla...bla
})

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

4
এছাড়াও, কোন উত্তরই আসলে সমস্যার সমাধান করে। প্রথমটি মৌলিক পূর্বশর্তটিকে ব্যর্থ করে, যা আমাদের 'স্কোপ.এবসি'কে অর্পণ করা উচিত এবং "স্কোপ [' এবিসি '] না করার জন্য করা উচিত, এবং দ্বিতীয়টিও এটি ব্যর্থ হয় এবং আক্ষরিক অর্থে আক্ষরিকভাবে একই জিনিসটিকে" সরল সংস্করণ "হিসাবে চিহ্নিত করে প্রশ্ন, কেবল অপ্রয়োজনীয় বাক্য গঠন সহ, তবে সম্ভবত এটি টাইপো? :)
এরিক হান

0

আপনি যদি নীচে লোডাশ লাইব্রেরি ব্যবহার করছেন তবে কৌনিক স্কোপে একটি ডায়নামিক ভেরিয়েবল সেট করার উপায়।

কৌণিক সুযোগে মান নির্ধারণ করতে।

_.set($scope, the_string, 'life.meaning')

কৌণিক সুযোগ থেকে মান পেতে।

_.get($scope, 'life.meaning')

-1

আপনি যদি ভাবছেন যে আপনি যা করার চেষ্টা করছেন তা করার চেষ্টা করছেন, তবে আপনাকে কেবল একটি নিয়মিত জেএস বস্তুর মতো সুযোগের চিকিত্সা করতে হবে।

এটি আমি JSON ডেটা অ্যারের জন্য একটি API সাফল্যের প্রতিক্রিয়া হিসাবে ব্যবহার করি ...

function(data){

    $scope.subjects = [];

    $.each(data, function(i,subject){
        //Store array of data types
        $scope.subjects.push(subject.name);

        //Split data in to arrays
        $scope[subject.name] = subject.data;
    });
}

এখন {{বিষয়গুলি} data ডেটা বিষয়গুলির নামের একটি অ্যারে ফিরিয়ে দেবে, এবং আমার উদাহরণে $ {কাজ} {, {{গ্রাহক}}, {{স্টাফ}} ইত্যাদির জন্য স্কোপ থেকে একটি সুযোগের বৈশিষ্ট্য থাকবে। কাজ, $ স্কোপ


4
উত্তরের জন্য ধন্যবাদ তবে এটি একই জিনিস নয়। এটি হার্ড-কোডিং ছাড়াই স্ট্রিং থেকে $ স্কোপ.সুবজেক্ট.নাম তৈরির বিষয়ে $ স্কোপ.সউজেক্ট about এটি এমন কয়েকটি নির্দেশের ক্ষেত্রে প্রাসঙ্গিক যেখানে আপনি নির্দেশটি পুনঃব্যবহারযোগ্য হতে চাইলে আপনার সুযোগ সম্পর্কে কোনও ধারণা নেওয়া উচিত নয়। এছাড়াও, কৌণিক.ফর প্রতিটি ()! কৌণিক ব্যবহারের পথে jQuery কে যেন পেতে না দেয়: পি
এরিক হ্নেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.