2013-06-19 8 views
10

अगर आपको अधिक जानकारी चाहिए या मुझे कुछ भी स्पष्ट करना चाहते हैं तो कृपया मुझे बताएं। मैंने इसे समझने के लिए कई अलग-अलग चीजों की कोशिश की है लेकिन समाधान नहीं मिला है।एंजुलरजेएस दो-तरफा डेटा बाध्यकारी नेस्टेड निर्देशों में

मैं कोणीय जेएस के लिए अपेक्षाकृत नया हूं और मैं डेटा की कई परतों के साथ एक ऐप बनाने की कोशिश कर रहा हूं। मेरे पास नियंत्रक पेज कंट्रोलर पर शरीर के दायरे में संग्रहीत कुछ मूल उपयोगकर्ता जानकारी है। मेरे पास एक सेटिंग फॉर्म है जो $ रूट पैराम (नियंत्रक सेटिंग्स नियंत्रक के साथ) का उपयोग करने में लोड होता है जिसमें टेम्पलेटिंग उद्देश्यों के लिए कुछ कस्टम निर्देश शामिल हैं। चूंकि निर्देश निहित हैं, इसलिए मैं पहले के अंदर दूसरे को लोड करने के लिए ट्रांसक्यूलेशन का उपयोग कर रहा हूं। ऐसा लगता है कि यह सब ठीक काम कर रहा है।

मेरे समस्या यह है कि मैं अंतरतम निर्देश के भीतर से क्षेत्र user.firstname संदर्भित करने के लिए कोशिश कर रहा हूँ और पाठ बॉक्स में किए गए PageController दायरे में मूल्य पैदा करने के लिए और साथ ही बदलने के लिए परिवर्तन की अनुमति के लिए दो तरह से डेटा बाइंडिंग का उपयोग करना चाहते है। मुझे पता है कि इस तरह की कई समस्याएं एनजी-मॉडल में प्राइमेटिव्स का उपयोग करके होती हैं, लेकिन मैंने सबकुछ एक अतिरिक्त ऑब्जेक्ट में डालने का प्रयास किया है ताकि मैं प्रोटोटाइप विरासत को किसी भी लाभ के लिए ट्रिगर कर सकूं। मुझसे यहां क्या गलत हो रहा है?

यहां मेरे कोड का JSFiddle है, जो समस्या को अलग करने के लिए जितना संभव हो सके उतना नीचे छीन लिया गया है। इस उदाहरण में, यदि मैं बाहरी टेक्स्टबॉक्स में टाइप करता हूं, जो सीधे पेजकंट्रोलर स्कोप पर है, तो वह उस टेक्स्टबॉक्स को तब तक संशोधित करेगा जब तक कि टेक्स्टबॉक्स संशोधित नहीं होता है, जिस पर कनेक्शन टूटा हुआ है। यह अन्य प्रश्नों में वर्णित प्राइमेटिव्स का उपयोग करने की समस्या की तरह लगता है, लेकिन मैं यह नहीं समझ सकता कि समस्या कहां है।

HTML:

<body class="event-listing" ng-app="app" ng-controller="PageController"> 
    <div class="listing-event-wrap"> 
     <input type="text" ng-model="user.firstname" /> 
     <div ng-controller="SettingsController"> 
      <section block title="{{data.updateInfo.title}}" description="{{data.updateInfo.description}}"> 
       <div formrow label="{{data.updateInfo.labels.firstname}}" type="textInput" value="user.firstname"></div> 
      </section> 
     </div> 
    </div> 
</body> 

कोणीय निर्देशों:

app.directive('formrow', function() { 
return { 
    scope: { 
      label: "@label", 
      type: "@type", 
      value: "=value" 
    }, 
    replace: true, 
    template: '<div class="form-row">' + 
      '<div class="form-label" data-ng-show="label">{{label}}</div>' + 
      '<div class="form-entry" ng-switch on="type">' + 
       '<input type="text" ng-model="value" data-ng-switch-when="textInput" />' + 
      '</div>' + 
     '</div>' 
} 
}); 
app.directive('block', function() { 
return { 
    scope: { 
      title: "@title", 
      description: "@description" 
    }, 
    transclude: true, 
    replace: true, 
    template: '<div class="page-block">' + 
      '<h2 data-ng-show="title">{{title}}</h2>' + 
      '<p class="form-description" data-ng-show="description">{{description}}</p>' + 
      '<div class="block-inside" data-ng-transclude></div>' + 
      '</div>' 
} 
}); 

कोणीय नियंत्रकों: तो

app.controller("PageController", function($scope) { 
    $scope.user = { 
     firstname: "John" 
    }; 
}); 
app.controller("SettingsController", function($scope) { 
    $scope.data = { 
     updateInfo: { 
      title: "Update Your Information", 
      description: "A description here", 
      labels: { 
       firstname: "First Name" 
      } 
     } 
    } 
}); 

उत्तर

9

मैं पिछले कोड के लिए rry। इसके बजाए इसे आजमाएं: http://jsfiddle.net/CxNc2/2/

वास्तविक मूल्य पारित करने के बजाय, अब मैं ऑब्जेक्ट + सही सूचक के अंदर एक पॉइंटर पास कर रहा हूं। मैं 'refobject' यहाँ कहा:

<body class="event-listing" ng-app="app" ng-controller="PageController"> 
    <div class="listing-event-wrap"> 
     <input type="text" ng-model="user.firstname" /> 
     <div ng-controller="SettingsController"> 
      <section block title="{{data.updateInfo.title}}" description="{{data.updateInfo.description}}"> 
       <div formrow label="{{data.updateInfo.labels.firstname}}" type="textInput" refobj='user' value="firstname"></div> 
      </section> 
     </div> 
    </div> 
</body> 

और मैं refobj + मूल्य यहाँ कहा: ng-model="someobj.somevalue" बजाय

app.directive('formrow', function() { 
    return { 
     scope: { 
      label: "@label", 
      type: "@type", 
      value: "@value", 
      refobj: "=" 
     }, 
     replace: true, 
     template: '<div class="form-row">' + 
      '<div class="form-label" data-ng-show="label">{{label}}</div>' + 
      '<div class="form-entry" ng-switch on="type">' + 
     '<input type="text" ng-model="refobj[value]" data-ng-switch-when="textInput" />' + 
      '</div>' + 
     '</div>' 
    } 
+0

इतनी त्वरित प्रतिक्रिया के लिए धन्यवाद! मैंने बेवकूफ़ों की कोशिश की लेकिन ऐसा लगता है कि मैंने पोस्ट किया है। एक समारोह में इसे बदलने का लक्ष्य क्या है? – princjef

+0

मैंने refobj जोड़ा ताकि आपको निर्देश के भीतर 'firstname' को कॉल करने की आवश्यकता न हो क्योंकि मुझे यकीन है कि आप इसे सामान्य बनाना चाहते हैं। – Nir

+0

यह वास्तव में चालाक है! डॉट के बजाय सरणी नोटेशन का उपयोग करने के बारे में सोचा नहीं था। यह मेरी जरूरतों के लिए काम करेगा। धन्यवाद! – princjef

8

के बाद से निर्देश में पाठ बॉक्स अपने मॉडल के लिए एक वस्तु के बजाय एक आदिम का उपयोग करता है (ng-model="value"), इसका मॉडल केवल स्थानीय दायरे पर बनाया गया है और माता-पिता के पास इसका उपयोग नहीं है।

<div formrow ... value="user"></div> 
:

ng-model="value.firstname" 

तो बस आदिम संपत्ति के बजाय निर्देश में पूरी user वस्तु पारित:

ठीक एक वस्तु संपत्ति के रूप में dot rule का उपयोग कर के निर्देश पाठ बॉक्स मॉडल को परिभाषित करने के लिए है

Here is a demo

+0

ओह, मैं देखता हूं कि मैं कहां गलत हुआ। अंतर्दृष्टि के लिए धन्यवाद – princjef

+0

अरे, मैंने चीजों को स्पष्ट रूप से देखने के लिए अपने डेमो को सरल बना दिया है। ऐसा प्रतीत होता है कि यह जटिल वस्तुओं के साथ काम करता है, लेकिन सरल गुणों के साथ नहीं ... [यहां अद्यतन संस्करण है] (http://jsfiddle.net/BXRnM/4/)। क्या आप देख सकते हैं क्यों? – Dmitry

+0

@Dmitry सरल संपत्ति का आपका उदाहरण ओपी की त्रुटि को पुन: उत्पन्न करता है।संक्षेप में इसे रखने के लिए, कोणीय क्षेत्रफल विरासत सरल आदिम चर के बजाय वस्तुओं की आवश्यकता है _। यह जावास्क्रिप्ट में प्रोटोटाइप विरासत का प्रत्यक्ष परिणाम है। आप [[यह उत्तर] देख सकते हैं (http://stackoverflow.com/questions/16928341/update-parent-scope-variable/16929117#16929117)] मैंने एक और उदाहरण देखने के लिए कहीं और दिया [[यह क्यू एंड ए] (http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs)] एक और विस्तृत स्पष्टीकरण के लिए। – sh0ber

0

समस्या मैं ng-switch के कारण, गिट से Understanding scope से डॉक्टर।

एनजी-स्विच स्कोप विरासत एनजी-शामिल की तरह काम करता है। इसलिए यदि आपको 2-तरफा डेटा मूलभूत दायरे में एक आदिम के लिए बाध्यकारी की आवश्यकता है, तो $ पैरेंट का उपयोग करें, या मॉडल को ऑब्जेक्ट में बदलने के लिए बदलें और उसके बाद उस ऑब्जेक्ट की संपत्ति से जुड़ें। यह माता-पिता के दायरे गुणों के छिपाने/छायांकन के बच्चे के दायरे से बच जाएगा।

ताकि यदि आप टेक्स्टबॉक्स में कुछ टेक्स्ट टाइप करते हैं। कोड के नीचे ng-switch स्कोप के लिए निष्पादित किया जाएगा।

$scope.value="the text you typed"

तो यह value है इस खोज करने के लिए प्रोटोटाइप श्रृंखला संपर्क नहीं कर सकेगा ng-switch गुंजाइश के लिए एक नया संपत्ति बनाई जाएगी।

इसे कैसे प्रमाणित करें?

यदि आप value से $parent.value बदलते हैं। सबकुछ ठीक काम करेगा। क्योंकि ng-switch में आदिम प्रकार के लिए (angularjs value को कोई प्रकार नहीं होने पर आदिम प्रकार के रूप में पहचानेंगे) $parentformrow निर्देशक दायरे का संदर्भ लेंगे।

ng-switch को निकालने का प्रयास करें या दस्तावेज़ के रूप में करें। समस्या गायब हो जाएगी।

और अधिक महत्वपूर्ण बात यह है कि दस्तावेज हमें द्वि-दिशात्मक बाध्यकारी लागू करते समय मॉडल को संदर्भित करने के लिए हमेशा एक बिंदु . का उपयोग करने की सलाह देते हैं।

अगर मैंने कुछ गलत कहा। कृपया मुझे सही तरीके से सही करें और इसे सही बनाएं। धन्यवाद।

संबंधित मुद्दे