इनलाइन कंडीशन्स in angular.js


192

मैं सोच रहा था कि क्या एनजी-शो आदि का उपयोग करने के अलावा सशर्त रूप से सामग्री प्रदर्शित करने के लिए कोणीय में एक तरीका है। उदाहरण के लिए backbone.js में मैं एक टेम्पलेट में इनलाइन सामग्री के साथ कुछ कर सकता था जैसे:

<% if (myVar === "two") { %> show this<% } %>

लेकिन कोणीय में, मुझे html टैग में लिपटी चीजों को दिखाने और छिपाने तक सीमित लगता है

<p ng-hide="true">I'm hidden</p>
<p ng-show="true">I'm shown</p>

कोणीय रूप से HTML टैग में सामग्री को लपेटने के बजाय केवल {{}} का उपयोग करके कोणीय में इनलाइन सामग्री को दिखाने और छिपाने के लिए कोणीय में अनुशंसित तरीका क्या है?


6
कृपया मेरे जवाब को स्वीकार करें 2Toad स्वीकार करें जब आपको मौका मिले।
बेन लेश

जवाबों:


139

संपादित करें: 2Toad का उत्तर नीचे दिया गया है जो आप खोज रहे हैं! उस चीज को उभारें

यदि आप कोणीय <= 1.1.4 का उपयोग कर रहे हैं तो यह उत्तर देगा:

इसके लिए एक और जवाब। मैं एक अलग उत्तर पोस्ट कर रहा हूं, क्योंकि यह संभव समाधान की सूची की तुलना में एक समाधान में "सटीक" प्रयास का अधिक है:

यहां एक फ़िल्टर है जो "तत्काल यदि" (उर्फ आईआईएफ) करेगा:

app.filter('iif', function () {
   return function(input, trueValue, falseValue) {
        return input ? trueValue : falseValue;
   };
});

और इस तरह इस्तेमाल किया जा सकता है:

{{foo == "bar" | iif : "it's true" : "no, it's not"}}

धन्यवाद देह, यह वही है जिसके लिए मैं जा रहा था। हालाँकि, मुझे लगता है कि अगर मैं एक HTML टैग लगाने की कोशिश करता हूं, जिसमें यह टूट जाता है: {{thing.second == "दो" | iif: "<ul class = 'two-class'>": "<ul>" "} मुझे पता है कि कोणीय में ऐसा करने के बेहतर तरीके हो सकते हैं, लेकिन क्या" <"और"> "से बचने का कोई तरीका है ताकि टैग स्ट्रिंग के भाग के रूप में आउटपुट हो सकें?
user1469779

1
ngBind HTML आउटपुट की अनुमति नहीं देता है, आप ng-bind-html-
Ben Lesh

कोणीय दस्तावेज में एनजी-बिनफ-एचटीएमएल-असुरक्षित का उदाहरण एक टैग के भीतर इसका उपयोग करता है, उदाहरण के लिए <कोई एनजी-बाइंड-एचटीएमएल-असुरक्षित = "{अभिव्यक्ति}">। यह संभव नहीं हो सकता है कि मैं इनलाइन करने की कोशिश कर रहा हूं।
user1469779

1
IIF "इनलाइन इफ" का संक्षिप्त नाम है। यह विभिन्न प्रोग्रामिंग भाषाओं में आम है ... बस के रूप में आम नहीं है ?: इनलाइन। ;)
बेन लेश

18
@BenLesh अपने जवाब को संपादित करने के लिए प्रमुख सहारा अब अन्य विकल्प, अच्छा काम है।
निक कोड

724

कोणीय ऑपरेटरों के लिए कोणीय 1.1.5 अतिरिक्त समर्थन:

{{myVar === "two" ? "it's true" : "it's false"}}

14
सबसे अधिक उत्थान के साथ यह उत्तर उत्तर के शीर्ष पर दिखाई देना चाहिए ... यह अब तक सबसे सही है
कोड व्हिस्परर

3
user1469779 इस उत्तर को स्वीकार करने पर विचार करें क्योंकि यह प्राप्त करने का अनुशंसित तरीका है जो आप कुछ समय के लिए चाहते हैं
फिलिप किव

13
@ 2Toad, मेरा जवाब पुराना था। यह अब सही उत्तर है, मुझे नहीं पता कि क्या उपयोगकर्ता अब इसे "स्वीकार" करने के लिए वापस आएगा, लेकिन मैंने अपना उत्तर इस तरह से एनोटेट किया है। ऐसा सॉफ्टवेयर डेवलपमेंट का बदलता चेहरा है।
बेन लेश

2
धन्यवाद। myVarयह गलत होने पर ही मैं इसका मूल्य कैसे प्रदर्शित कर सकता हूं ? (यानी मैं अभिव्यक्ति में चर कैसे कर सकता हूं?) मैंने कोशिश की {{myVar === "two" ? "it's true" : {{myVar}}}}लेकिन यह काम नहीं करता है।
जोश

6
@ myVarसंपत्ति को अतिरिक्त घुंघराले ब्रेसिज़ में लपेटने की आवश्यकता नहीं है, यह पहले से ही एक अभिव्यक्ति के अंदर है। कोशिश करें{{myVar === "two" ? "it's true" : myVar}}
2Toad

60

इस बिल्ली की त्वचा के हजारों तरीके। मुझे लगता है कि आप {{}} के बीच के बारे में पूछ रहे हैं, लेकिन दूसरों के लिए जो यहाँ आते हैं, मुझे लगता है कि यह कुछ अन्य विकल्पों को दिखाने के लायक है।

आपके $ स्कोप पर कार्य करना (IMO, यह अधिकांश स्थितियों में आपकी सर्वश्रेष्ठ शर्त है):

  app.controller('MyCtrl', function($scope) {
      $scope.foo = 1;

      $scope.showSomething = function(input) {
           return input == 1 ? 'Foo' : 'Bar';
      };
   });

 <span>{{showSomething(foo)}}</span>

एनजी-शो और एनजी-छिपाने का कोर्स:

 <span ng-show="foo == 1">Foo</span><span ng-hide="foo == 1">Bar</span>

ngSwitch

 <div ng-switch on="foo">
   <span ng-switch-when="1">Foo</span>
   <span ng-switch-when="2">Bar</span>
   <span ng-switch-default>What?</span>
 </div>

बर्ट्रेंड के रूप में एक कस्टम फ़िल्टर का सुझाव दिया। (यह आपकी सबसे अच्छी पसंद है अगर आपको एक ही काम बार-बार करना है)

app.filter('myFilter', function() {
   return function(input) {
     return input == 1 ? 'Foo' : 'Bar';
   }
}

{{foo | myFilter}}

या एक कस्टम निर्देश:

app.directive('myDirective', function() {
   return {
     restrict: 'E',
     replace: true,
     link: function(scope, elem, attrs) {
       scope.$watch(attrs.value, function(v) {
          elem.text(v == 1 ? 'Foo': 'Bar');
       });
     }
   };
});


<my-directive value="foo"></my-directive>

व्यक्तिगत रूप से, ज्यादातर मामलों में मैं अपने दायरे में एक फ़ंक्शन के साथ जाता हूं, यह मार्कअप को बहुत साफ रखता है, और यह त्वरित और लागू करना आसान है। जब तक, यानी आप बार-बार एक ही सटीक काम कर रहे हों, तो मैं बर्ट्रेंड के सुझाव के साथ जाऊंगा और परिस्थितियों के आधार पर एक फिल्टर या संभवतः एक निर्देश बना सकता हूं।

हमेशा की तरह, सबसे महत्वपूर्ण बात यह है कि आपके समाधान को बनाए रखना आसान है , और उम्मीद है कि परीक्षण योग्य है। और यह पूरी तरह से आपकी विशिष्ट स्थिति पर निर्भर करता है।


18

जब कक्षा एनजी का उपयोग नहीं किया जा सकता है (उदाहरण के लिए जब एसवीजी स्टाइल कर रहा हो) मैं सशर्त रूप से क्लास एट को सेट करने के लिए निम्नलिखित का उपयोग कर रहा हूं:

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

उसी दृष्टिकोण को अन्य विशेषता प्रकारों के लिए काम करना चाहिए।

(मुझे लगता है कि आपको एनजी- attr- का उपयोग करने के लिए नवीनतम अस्थिर कोणीय पर होने की आवश्यकता है, मैं वर्तमान में 1.1.4 पर हूं)

मैंने AngularJS + SVG के साथ काम करने पर एक लेख प्रकाशित किया है जो इस और संबंधित मुद्दों के बारे में बात करता है। http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS


15

एक चर सामग्री की जाँच करने और एक डिफ़ॉल्ट पाठ के लिए, आप इसका उपयोग कर सकते हैं:

<span>{{myVar || 'Text'}}</span>

1
धन्यवाद! मैं यह कोशिश कर रहा था, लेकिन मैं स्ट्रिंग के आसपास के उद्धरणों को याद करता हूं :-)
सिमोना एड्रियानी

जो भी कारण के लिए, यह वाक्यविन्यास एक समय बाइंडिंग का उपयोग करके काम नहीं करता है .. {{:: myVar || 'पाठ'}} काम नहीं करेगा। :: बिना होना चाहिए
aoakeson

3

अगर मैं आपको अच्छी तरह से समझता हूं तो मुझे लगता है कि आपके पास इसे करने के दो तरीके हैं।

पहले आप ngSwitch की कोशिश कर सकते थे और दूसरा संभव तरीका आपको खुद का फ़िल्टर बनाने में होगा । शायद ngSwitch सही aproach है, लेकिन यदि आप इनलाइन सामग्री को केवल {{}} फ़िल्टर का उपयोग करके छुपाना या दिखाना चाहते हैं, तो जाने का रास्ता है।

एक उदाहरण के रूप में एक साधारण फिल्टर के साथ एक बेला है

<div ng-app="exapleOfFilter">
  <div ng-controller="Ctrl">
    <input ng-model="greeting" type="greeting">
      <br><br>
      <h1>{{greeting|isHello}}</h1>
  </div>
</div>

angular.module('exapleOfFilter', []).
  filter('isHello', function() {
    return function(input) {
      // conditional you want to apply
      if (input === 'hello') {
        return input;
      }
      return '';
    }
  });

function Ctrl($scope) {
  $scope.greeting = 'hello';
}

3

कोणीय यूआई पुस्तकालय में टेम्पलेट / कंडिशन में कोणीय ui 1.1.4 के लिए अंतर्निहित यूआई-अगर निर्देश है

उदाहरण: ui 1.1.4 तक कोणीय यूआई में समर्थन

<div ui-if="array.length>0"></div>

एनजी-अगर 1.1.4 के बाद सभी कोणीय संस्करण में उपलब्ध है

<div ng-if="array.length>0"></div>

यदि आपके पास सरणी चर में कोई डेटा है तो केवल div दिखाई देगा


ui-ifकम से कम नवीनतम संस्करण कोणीय-यूआई से हटा दिया गया था, लेकिन जब से 1.1.5 कोण आपके पास है ng-if( इस टिप्पणी से )
डेव एवरिट

2

तो Angular 1.5.1 के साथ (कुछ अन्य MEAN स्टैक निर्भरता पर मौजूदा ऐप निर्भरता थी यही कारण है कि मैं वर्तमान में 1.6.4 का उपयोग नहीं कर रहा हूं)

यह मेरे लिए ओपी कह की तरह काम करता है {{myVar === "two" ? "it's true" : "it's false"}}

{{vm.StateName === "AA" ? "ALL" : vm.StateName}}

2

यदि आप "कोई नहीं" प्रदर्शित करना चाहते हैं जब मूल्य "0" है, तो आप निम्नानुसार उपयोग कर सकते हैं:

<span> {{ $scope.amount === "0" ?  $scope.amount : "None" }} </span>

या कोणीय js में सही गलत है

<span> {{ $scope.amount === "0" ?  "False" : "True" }} </span>

1

विदेशी स्थितियों में भी काम करता है:

<br ng-show="myCondition == true" />

0

मैं मिश्रण में मेरा फेंक देंगे:

https://gist.github.com/btm1/6802312

यदि यह एक बार स्टेटमेंट का मूल्यांकन करता है और कोई वॉच श्रोता नहीं जोड़ता है, लेकिन आप उस एलीमेंट में एक अतिरिक्त विशेषता जोड़ सकते हैं जिसमें सेट-इफ-वे = "somedata.prop" कहा जाता है और यह उस डेटा या प्रॉपर्टी के सेट होने से पहले इंतजार करेगा एक बार अगर बयान का मूल्यांकन। यदि आप XHR अनुरोध से डेटा की प्रतीक्षा कर रहे हैं तो अतिरिक्त विशेषता बहुत आसान हो सकती है।

angular.module('setIf',[]).directive('setIf',function () {
    return {
      transclude: 'element',
      priority: 1000,
      terminal: true,
      restrict: 'A',
      compile: function (element, attr, linker) {
        return function (scope, iterStartElement, attr) {
          if(attr.waitFor) {
            var wait = scope.$watch(attr.waitFor,function(nv,ov){
              if(nv) {
                build();
                wait();
              }
            });
          } else {
            build();
          }

          function build() {
            iterStartElement[0].doNotMove = true;
            var expression = attr.setIf;
            var value = scope.$eval(expression);
            if (value) {
              linker(scope, function (clone) {
                iterStartElement.after(clone);
                clone.removeAttr('set-if');
                clone.removeAttr('wait-for');
              });
            }
          }
        };
      }
    };
  });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.