AngularJs - स्कोप में डायनामिक स्कोप वैरिएबल सेट करना। <some_string>


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

1
इसलिए यह सुंदर है! लेकिन (और लगभग हमेशा एक होता है) मुझे अपना डेटा प्रचारित करने के लिए $ गुंजाइश नहीं मिल सकती। मैं इसे कंसोल लॉग में देख सकता हूं, लेकिन मेरा विचार नए जोड़े गए डेटा को नहीं दिखाता है (मेरे पास एक पाद बार है जहां मैं $ गुंजाइश दिखाता हूं) - कोई विचार?
विलियम ई श्रोएडर

कोड देखे बिना जानना मुश्किल है, लेकिन मेरा पहला अनुमान यह होगा कि पाद एक ही दायरे में नहीं है। यदि पाद एनजी-कंट्रोलर = "योरकंट्रोलर" के तत्व के बाहर है, तो उसके चर तक पहुंच नहीं होगी।
एरिक होन

3
जवाब के लिए धन्यवाद। मैं यह बताना चाहता हूँ कि असाइनमेंट जटिल वस्तुओं के साथ भी काम करता है, न कि केवल आदिम प्रकारों के साथ।
पैट्रिक सलामी

1
$ स्कोप क्यों है। $ लागू होना आवश्यक है?
sin

मैं वास्तव में काफी याद नहीं है। मुझे लगता है कि यह इसलिए था क्योंकि model.assign डेटा बाइंडिंग को ट्रिगर नहीं करता है, इसलिए आपको जो कुछ भी करने की ज़रूरत है वह सब कुछ करने के बाद आपको मैन्युअल रूप से आवेदन करना होगा। इसे आज़माएं और देखें कि क्या इसे हटाना संभव है या नहीं (हो सकता है कि यह कोणीय के नए संस्करणों में भी बदल गया हो, मुझे लगता है कि यह एक या दो संस्करण पीछे थे)।
एरिक होन

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

मैंने इसे $ स्कोप के साथ और बिना जांचे परखा है। $ लागू होते हैं। इसके बिना सही ढंग से काम करता है!


13
ध्यान दें कि यह सवाल के बारे में पूरी तरह से अलग है। प्रश्न का लक्ष्य एक स्ट्रिंग पर आधारित 1 से अधिक गहराई के साथ एक डायनामिक स्कोप वैरिएबल बनाना है। तो "स्कोप.लाइफ़.इनिंग" बनाने के लिए और न कि "स्कोप.लाइफ़ माइनिंग"। $ गुंजाइश [the_string] का उपयोग करने से ऐसा नहीं होगा। और आपके विशिष्ट मामले के लिए, याद रखें कि अपरिभाषित वास्तव में javascrip में सच है, इसलिए आप वास्तव में संपूर्ण कथन को छोड़ सकते हैं और केवल $ गुंजाइश [the_string] =! $ गुंजाइश [the_string] ;। हालांकि, कोड को थोड़ा सा मैला कर सकता है, इसलिए मुझे यकीन नहीं है कि यह वास्तव में ऐसा कुछ है जो आप चाहते हैं।
एरिक होन

@ ErikHonn, वास्तव में, $ गुंजाइश [life.meaning] = सच में मेरे लिए काम किया!
जेसी पी फ्रांसिस

1
यह "काम करता है", लेकिन जब तक 1.6 में कुछ बदल नहीं जाता तब तक यह वैसा नहीं करता जैसा कि सवाल पूछता है। यदि आप $ स्कोप [Life.meaning] = सही करते हैं तो प्रॉपर्टी का नाम "Life.meaning" होगा, और यह वह नहीं है जो हम चाहते हैं। हम एक संपत्ति चाहते हैं जिसे जीवन कहा जाता है जिसमें एक बाल संपत्ति होती है जिसे अर्थ कहा जाता है।
एरिक होन

13

परिणामों से डायनामिक कोणीय चर बनाएं

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

ps। अपने नियंत्रक के कार्य में $ पार्स विशेषता को पारित करने के लिए मत भूलना


5

यदि आप लॉडश का उपयोग करने के साथ ठीक हैं, तो आप _.set () का उपयोग करके एक पंक्ति में इच्छित चीज़ कर सकते हैं:

_.set (ऑब्जेक्ट, पथ, मान) ऑब्जेक्ट पर पथ का गुण मान सेट करता है। यदि पथ का कोई भाग मौजूद नहीं है तो इसे बनाया जाता है।

https://lodash.com/docs#set

तो आपका उदाहरण बस यही होगा: _.set($scope, the_string, something);


4

बस दिए गए उत्तर में जोड़ने के लिए, निम्नलिखित ने मेरे लिए काम किया:

HTML:

<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
})

3
उत्तर के लिए धन्यवाद, लेकिन सवाल यह नहीं था कि "सरल संस्करण" काम क्यों नहीं करेगा, यह शुरुआत से ही जाना जाता था। सवाल यह था कि विकल्प क्या था। मुझे डर है कि आपके दोनों सुझावों में से कोई भी काम नहीं करेगा, दोनों को आपको पहले से स्ट्रिंग की संरचना को जानने की आवश्यकता है, और बिंदु इसके लिए गतिशील होना (और मनमाने तारों को संभालने में सक्षम होना) है। समाधान के लिए स्वीकृत उत्तर देखें।
एरिक होन

1
इसके अलावा, न तो जवाब वास्तव में इस मुद्दे को हल करता है। पहला मूल शर्त को विफल करता है, कि हमें $ गुंजाइश के लिए आवंटित करना चाहिए। सवाल, केवल अनावश्यक सिंटैक्स के साथ, लेकिन शायद यह एक टाइपो है? :)
एरिक होन

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;
    });
}

अब {{विषयों}} डेटा विषय नामों की एक सरणी लौटाएगा, और मेरे उदाहरण में $ गुंजाइश से {{नौकरियों}}, {{ग्राहकों}}, {{स्टाफ}}, आदि के लिए एक गुंजाइश विशेषता होगी। नौकरियों, $ गुंजाइश। ग्राहक, $ गुंजाइश.staff


4
उत्तर के लिए धन्यवाद, लेकिन यह एक ही बात नहीं है। यह हार्ड-कोडिंग $ गुंजाइश.subject के बिना स्ट्रिंग से $ गुंजाइश.subject.name बनाने के बारे में है। यह कुछ निर्देशों में प्रासंगिक है जहां आप गुंजाइश के बारे में कुछ भी नहीं मान सकते हैं यदि आप चाहते हैं कि निर्देश पुन: प्रयोज्य हो। इसके अलावा, कोणीय.forEach ()! कोणीय का उपयोग करने के रास्ते में jQuery प्राप्त न होने दें: P
Erik Honn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.