2016-07-20 8 views
0

Ich habe ein Formular mit angularJs, alle Code ist auf meinem Plunker am Ende der Frage verfügbar.

in meinem Controller ich habe

$scope.showTelfield= false; $scope.showEmailfield= false; 

in meiner Form und für Telefonfeld und E-Mail-Feld i`m mit:

ng-show="showTelField" ng-show="showEmailField" 

diese Werte wahr sein sollten, wenn der Benutzer sich von der Auswahl Wählen Sie die Optionen aus, wie sie im Controller vorgesehen sind.

in html

<select class="form-control c-select" name="select" ng-model="feedback.myChannel" ng-options="channel.value as channel.label for channel in channels"> 
<option value="">Select a method</option> 
</select> 

in Controller:

$scope.feedback = { 
    myChannel: "", 
    firstName: '', 
    lastName: '', 
    agree: false, 
    email: '' 
}; 
$scope.channels = [{ 
    value: "Tel", 
    label: "Tel" 
}, { 
    value: "Email", 
    label: "Email" 
}, { 
    value: "Tel & Email", 
    label: "Tel & Email" 
}]; 


//Telling browser to view telephone or Email feild if needed.. 
    if($scope.feedback.myChannel === "Tel" || $scope.feedback.myChannel === "Tel & Email"){ 
     $scope.showTelField = true } 

    if($scope.feedback.myChannel === "Email" || $scope.feedback.myChannel === "Tel & Email"){ 
     $scope.showEmailField = true } 

der Wert von $ scope.feedback.myChannel von einer leeren Zeichenfolge ändert sich auf "Tel", "E-Mail" oder „Tel & Email "basierend auf der benutzerauswahl und ich zeige das innerhalb einer extra div nur für entwicklungszwecke, um sicherzustellen, dass sie sich bei der benutzerauswahl ändern.

aber alle if-Anweisungen funktionieren nicht, obwohl sich der Wert von $ scope.feedback.myChannel entsprechend dem angezeigten div ändert, den ich für die Entwicklung mache. irgendeine idee warum ist das?

Sie können meinen Code in meinem Plunker Here is my plunker

und hier ist ein Screenshot der der Seite screenshot

Antwort

1

Zuerst wird die ifs, die Sie in Ihrem Controller haben nur dann, wenn Seite aufgerufen werden Lasten, danach angular ignoriert es , wenn Sie Ihre Logik in eine function auf der $scope setzen.

Um eine Änderung in Ihrem <select> erkennen Sie ngChange Richtlinie, wie diese verwendet werden soll:

Ausblick:

<select ng-change="change()" class="form-control c-select" name="select" ng-model="feedback.myChannel" ng-options="channel.value as channel.label for channel in channels"> 

JS:

$scope.change = function() { 
    console.log($scope.feedback.myChannel); 
} 

dann diejenigen Variablen, die Sie versuchen, Ihre Daten zu manipulieren (showTelField, showEmailField) kann einfach durch eine Richtlinie, dhngSwitch ersetzt werden, so dass Sie etwas davon haben können:

<div ng-switch="feedback.myChannel"> 
    <div class="form-group " ng-class="{'has-error': !feedbackForm.telnum.$pristine && feedback.tel.number == '' || feedback.tel.areacode == ''}" ng-switch-when="Tel"> 
    ... 
    </div> 
    <div class="form-group has-feedback" ng-class="{'has-error': !feedbackForm.email.$pristine && feedback.email == '' || feedbackForm.email.$invalid }" ng-switch-when="Email"> 
    ... 
    </div> 
    <div ng-switch-when="Tel & Email"> 
    ... 
    </div> 
</div> 

Auch ich Sie ngIf Direktive statt ngShow in einigen Teilen zu verwenden, würde vorschlagen, Ihre code als eine gute Praxis.

Werfen Sie einen Blick auf die gegabelten DEMO.

+0

Vielen Dank .. bitte wissen, dass: ng-show = "feedback.agree && (feedback.myChannel == 'Tel' || feedback.myChannel == 'Tel & Email')"> funktioniert auch! Y? Ich kann das gewünschte Ergebnis durch einige Lösungen erreichen, aber meine Frage ist, wie kann ich feedback.myChannel in html verwenden und kann es nicht als $ scope.feedback.myChannel im Controller verwenden? und wenn du sagst: es gibt keine Möglichkeit zu zeigen, dass TelField und showEmailField wahr sind, da du sie nicht auf wahr einstellst .. aber wenn du eine Option wählst, setze feedback.myChannel auf einen Wert .. gehe zu ur bottle und benutze ng- zeige wie oben. –

+0

und ohne all das, schau in das angezeigte div auf der rechten Seite zeigt es, dass feedback.myChannel einen Wert nach Auswahl nimmt .. und das ist, was meine if-Statements sagen .. ändern showTelField und showEmailField zu true, wenn feedback.myChannel ein Wert. !!! –

+0

Nun, ich bin mir nicht sicher, ob es funktioniert .. Ich habe es nicht einmal getestet, weil "ng-show" eine schlechte Übung ist, du solltest 'ngIf' oder ** BETTER **' ngSwitch' verwenden, was genau dafür gemacht wurde Art der Sache. Und für deine Frage lautet die Antwort: ** no **, die Werte ('showTelField' &' showEmailField') können nicht wahr sein, da du keine Möglichkeit gefunden hast, sie wahr zu machen .. was ist das Problem mit der Lösung oben? Was meinst du, wenn du sagst "Ich kann die Variable nicht in meinem Controller verwenden" ** ???? – developer033

0

Es ist besser sehen die Formcontrol-Objekt zu vertrauen, von ng-show="feedback.agree" zu ng-if="feedback.agree" ändern und machen die Auswahl required Feld:

<div class="col-sm-3 col-sm-offset-1" ng-if="feedback.agree"> 
    <select class="form-control c-select" name="select" ng-model="feedback.myChannel" ng-options="channel.value as channel.label for channel in channels" required> 
     <option value="">Select a method</option> 
    </select> 
    <span class="help-block" ng-show="invalidChannelSelection && feedback.myChannel == ''">Select a method</span> 
</div> 

Und dann können Sie die Submit-Button b deaktivieren asierend über die Gültigkeit Zustand der Form (Ich entfernte die || invalidChannelSelection aus der ngDisabled Richtlinie):

<button type="submit" class="btn btn-primary" name="submit" ng-disabled="feedbackForm.$invalid">Send Feedback</button> 

Arbeitsbeispiel: http://plnkr.co/edit/un9BYMa81cqWOCyd4Vdj?p=preview

+0

danke, ich schaute in Ihrem Plunker und es zeigt nicht diese Felder auf die Auswahl einer Option. –

+0

und ich denke, ich kann nicht wählen erforderlich, falls der Benutzer nicht kontaktiert werden möchte, so wird das Formular immer ungültig .. wahr !! Bitte lies auch meinen Kommentar @ developer33 unten .. wie ich mehr über meine Frage erkläre. –