2012-12-14 9 views
13

में किसी सरणी के किसी विशिष्ट आइटम के लिए डेटा बाध्यकारी जावास्क्रिप्ट ऑब्जेक्ट्स की एक सरणी वाली डेटा संरचना को देखते हुए, मैं उस सरणी से कोणीय का उपयोग करके इनपुट फ़ील्ड में एक निश्चित प्रविष्टि कैसे बांध सकता हूं?कोणीय

डेटा संरचना इस तरह दिखता है:

$scope.data = { 
    name: 'Foo Bar', 
    fields: [ 
     {field: "F1", value: "1F"}, 
     {field: "F2", value: "2F"}, 
     {field: "F3", value: "3F"} 
    ] 
}; 

fields सरणी दोनों एक field विशेषता है और एक value विशेषता होने प्रत्येक प्रविष्टि के साथ, यह देखते हुए संरचना के कई उदाहरण हैं।

मैं कैसे fieldF1 के साथ सरणी प्रविष्टि के value क्षेत्र विशेषता के लिए एक input नियंत्रण बाध्य कर सकते हैं?

<input ng-model="???"/> 

मुझे पता है कि मैं एक ng-repeat का उपयोग कर सभी क्षेत्रों के लिए बाध्य कर सकता है, लेकिन वह नहीं है जो मैं चाहता। उपरोक्त डेटा फ़ील्ड की एक बड़ी सूची से सिर्फ एक उदाहरण है, जहां मैं केवल स्क्रीन पर नियंत्रण के लिए फ़ील्ड के प्री-डिफ़ाइंड सबसेट को बांधना चाहता हूं। सबसेट सरणी प्रविष्टियों में विशेषताओं पर आधारित नहीं है, लेकिन पृष्ठ के डिज़ाइन समय पर जाना जाता है।

तो उपर्युक्त उदाहरण के लिए, मैं पृष्ठ पर एक इनपुट में F1 को बाध्य करने का प्रयास करता हूं, और F2 को किसी अन्य पर। एफ 3 नियंत्रण के लिए बाध्य नहीं होगा।

मैंने उदाहरण देखे हैं जहां ng-model में फ़ंक्शन का उपयोग किया गया था, लेकिन यह कोणीय 1.1.0 के साथ काम नहीं कर रहा है।

क्या इनपुट फ़ील्ड को एक विशिष्ट सरणी प्रविष्टि में बांधने का एक और चालाक तरीका है?

यहाँ एक बेला एक उदाहरण है कि है, लेकिन क्योंकि यह ng-model विशेषता में समारोह का उपयोग करने के कोशिश कर रहा है काम नहीं करता: http://jsfiddle.net/nwinkler/cbnAU/4/

अद्यतन

नीचे सिफारिश के आधार पर, इस यह क्या करना चाहिए है देखो की तरह: http://jsfiddle.net/nwinkler/cbnAU/7/

उत्तर

11

मैं व्यक्तिगत रूप से एक तरह से सरणी पुनर्निर्माण होता है कि क्षेत्र सरणी के एक प्रवेश की संपत्ति obje के पहचानकर्ता बन सीटी। Mhhh कि वाक्य अजीब लग सकता है।

$scope.data = { 
    name: 'F1', 
    fields: { 
     F1: { 
      value: "1F" 
     }, 
     F2: { 
      value: "2F" 
     } 
    } 
}; 

आप मान डायनामिक बाध्य करने के लिए चाहते हैं और यह इसे प्राप्त करने के लिए एक आसान और त्वरित तरीका बताया गया है: क्या मेरा मतलब है निम्नलिखित है। यहां आपका पहेली संशोधित है ताकि यह शब्द हो।http://jsfiddle.net/RZFm6/

मुझे आशा है कि मदद करता है

+0

हां, बेहतर संरचना में सरणी को पुनर्गठित करना मैंने जो भी सोचा था, वह है। मुझे यकीन नहीं है कि यह संभव है, क्योंकि हमें बैकएंड सेवा से JSON प्राप्त होता है। मुझे उनसे पूछना होगा कि क्या वे संरचना बदलते हैं। – nwinkler

+0

@nwinkler यदि आप अंतर्निहित मॉडल को अक्सर बदलते हैं तो यह किसी भी तरह से इसे बांधने से पहले सरणी (आपके नियंत्रक के भीतर) को प्रीप्रोसेस करने के लिए समझ में आता है क्योंकि आपकी वर्तमान संरचना के साथ आपको हर बार जब आप एक नया मॉडल बांधते हैं तो आपको सरणी को खोजना होगा। ऑब्जेक्ट के माध्यम से एक बार लूप को पुनर्गठित करने के साथ और आप कर चुके हैं। यदि वे आपके लिए एपीआई बदलते हैं तो यह भी बेहतर है :) –

+0

इस उत्तर को स्वीकार किया क्योंकि मुझे लगता है कि ऐसा करने का सही तरीका है। हम डेटा के प्रारूप को बदलने और आपके द्वारा वर्णित की तरह इसका उपयोग करने में देखेंगे। – nwinkler

3

एक तरह से यह बस इस तरह, गुंजाइश के लिए आवश्यक संदर्भ जोड़ने के लिए है करने के लिए:

$scope.fieldF1 = fieldValue('F1'); 
$scope.fieldF2 = fieldValue('F2'); 

और फिर उन संदर्भ का उपयोग:

<input ng-model="fieldF1.value"/> 
<input ng-model="fieldF2.value"/> 

फिडल: http://jsfiddle.net/cbnAU/5/

नोट: मैं मानी हूं ng कि $scope.data स्थैतिक है, लेकिन यदि यह गतिशील होता है तो आप हमेशा इसके लिए परिवर्तनों को देख सकते हैं और संदर्भों को फिर से समझ सकते हैं ...

+0

डेटा गतिशील है (बैकएंड सेवा से प्राप्त), और इसमें फ़ील्ड की एक बड़ी सूची शामिल होगी। आप क्या सुझाव देते हैं, लेकिन हमारे उपयोग के मामले के लिए व्यावहारिक नहीं है। – nwinkler

8

आप ऑब्जेक्ट्स की एक सरणी का उपयोग कर सकते हैं, केवल तारों की सरणी नहीं।

HTML:

<div ng-repeat="field in data.fields"> 
    <input ng-model="field.val"/> 
</div> 

जे एस:

$scope.data = { 
    name: 'F1', 
    fields: [ 
     { val: "v1" }, 
     { val: "v2" } 
    ] 
}; 

मैं नवीनीकृत किया है @ Flek की बेला यहाँ: http://jsfiddle.net/RZFm6/6/

संपादित करें: माफ करना अभी ठीक से अपने प्रश्न पढ़ा है, आप अभी भी एक का उपयोग कर सकते सरणी के साथ:

<label>Bound to F1:</label> 
<input ng-model="data.fields[0].value"/> 

हालांकि शायद रुकें और सोचें। क्या फ़ील्ड की परिवर्तनीय संख्या होने जा रही है? या आप खेतों की पूर्व निर्धारित संख्या बना रहे हैं? पूर्व में एक सरणी और उत्तरार्द्ध के लिए एक वस्तु का प्रयोग करें।

+0

यहां ध्यान देने योग्य मूल्य यह है कि यदि आप खेतों [0] स्थिति के बिना खेतों [1] को मॉडल और मॉडल करते हैं, तो angularJS इसे मानचित्र के रूप में व्याख्या करेगा। यह एक सरणी की उम्मीद कर रहे एक वसंत नियंत्रक के साथ संघर्ष हो सकता है। याद रखना वाकई मुश्किल है क्योंकि "फ़ील्ड्स [0]" को सरणी पॉज़ और मैप पॉज़ दोनों के रूप में व्याख्या किया जा सकता है। –