2015-06-11 10 views
10

मैं ng-if और scopes को समझने की कोशिश कर रहा हूं। जैसा कि मुझे पता है, एनजी-अगर एक नया बच्चा गुंजाइश बनाता है।AngularJS ng-if और scopes

देखें

<input ng-model="someValue1" /> 
<div ng-if="!someCondition"> 
    <input ng-model="$parent.someValue2" /> 
</div> 

नियंत्रक

$scope.someCondition = true; 

if ($scope.someCondition) { 
    $scope.someValue2 = $scope.someValue1;   
} 

someCondition सही पर सेट किया जाता है, तो someValue2 someValue1 के रूप में ही किया जाना चाहिए: यहाँ मेरी समस्या है।

मेरी समस्या यह है कि मैं दोनों स्थितियों (सत्य या गलत) में कुछ Value2 तक नहीं पहुंच सकता। मैं इसे कैसे प्राप्त कर सकता हूं?

+3

कोणीय क्या तुमने कभी सीधे $ माता पिता के गुण मूल्य को संशोधित कभी नहीं करना चाहिए।हालांकि आप $ मूल संपत्तियों की संपत्ति को संशोधित कर सकते हैं या आप विरासत तोड़ देंगे। करें: '$ parent.someValue.num = 10', यह न करें:' $ parent.someValue = 10' – Freezystem

उत्तर

-6

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

आप कुछ इस तरह से जब और झूठे और सच के बीच "someCondition" परिवर्तन है, तो आप उपयोग कर सकते हैं $ बराबर मान 1 के लिए अपने मूल्य 2 स्विच देखने के लिए करना चाहते हैं:

$scope.$watch(someCondition, function(){ 
    if (someCondition){ 
    $scope.someValue1 = $scope.someValue2 
    } 
}) 
+0

आपकी टिप्पणी के लिए धन्यवाद। मेरी हालत भी गुंजाइश पर है, इसलिए मुझे नहीं लगता कि मुझे इसे देखना होगा। –

+0

संख्या ngIf ngShow से अलग है, ngHide इसमें यह HTML तत्व को छिपाता नहीं है। यह पूरी तरह से इसे नष्ट कर देता है। और यह वास्तव में प्रोटोटाइप विरासत का उपयोग कर एक नया दायरा बना देता है। https://docs.angularjs.org/api/ng/directive/ngIf – user2734679

+1

@ user2734679 अच्छा दोस्त, लिंक के लिए धन्यवाद! मैं हर दिन कोणीय के बारे में कुछ नया सीखता हूं :-) – FrankieAvocado

7

ngIf वास्तव में पैदा नहीं करता है प्रोटोटाइप विरासत का उपयोग कर एक नया दायरा। इसका मतलब यह है कि एनजीआईएफ स्कोप प्रोटोटाइप ऑब्जेक्ट इसके मूल दायरे का है। इसलिए यदि विशेषता इस प्रकार के दायरे के उदाहरण पर नहीं मिली है तो यह उस विशेषता के लिए प्रोटोटाइप ऑब्जेक्ट श्रृंखला में दिखाई देगी। हालांकि, एक बार जब आप दायरे के उदाहरण में एक विशेषता निर्दिष्ट करते हैं तो यह अब विशेषता के लिए इसकी विरासत श्रृंखला पर नहीं दिखेगा। जेएस में प्रयुक्त प्रोटोटाइपियल विरासत को समझाते हुए एक लिंक यहां दिया गया है। https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance

इसे कैसे हल करें।

जनक नियंत्रक:

$scope.data = {someValue: true}; 

बाल नियंत्रक:

$scope.data.someValue = false 

क्योंकि आपने इस पर यह के माता-पिता गुंजाइश एक विशेषता छुपा नहीं कर रहे हैं, तो आप सिर्फ माता-पिता गुंजाइश पर एक वस्तु परिवर्तनशील करते हैं कि इसमें, वास्तव में माता-पिता डेटा obj बदल जाएगा। तो आपके मामले में।

<input ng-model="data.someValue1" /> 
<div ng-if="!data.someCondition"> 
    <input ng-model="data.someValue2" /> 
</div> 
+0

मैं इसमें डुबकी दूंगा, धन्यवाद :) –

+0

उपयोगकर्ता 2734679 क्या आप मुझे एक और स्पष्टीकरण दे सकते हैं? कुछ वैल्यू के कुछ मूल्यों के साथ। दुर्भाग्य से मुझे अभी भी यह नहीं मिला है। –

+0

यह एक कोणीय चीज नहीं है। यह एक जावास्क्रिप्ट चीज है। तो प्रोटोटाइप विरासत के कुछ उदाहरण यहां दिए गए हैं। – user2734679

19

हाँ, ng-if एक नए बच्चे गुंजाइश

बनाता है एक ng-if में एक मॉडल संपत्ति देखने के लिए, नियम-ऑफ-अंगूठे है:

मॉडल

के रूप में स्कोप प्रयोग न करें

उदाहरण

ng-if='showStuff' //here my scope is model **INCORRECT** 
ng-if='someObject.showStuff' // ** CORRECT ** 

एनजी मॉडल में एक वस्तु संपत्ति का प्रयोग करें - तो, ​​भले ही ng-if नए बच्चे गुंजाइश बनाता है, माता पिता के दायरे में परिवर्तन करना होगा।

एक काम Plunker देखने के लिए, यहाँ देखो: http://jsfiddle.net/Erk4V/4/