2016-12-07 5 views
1

nicht möglich Ich entwickle einen Filter in angleJS. Alles funktioniert gut, aber nur an einer Stelle kann ich nicht auf das Scope-Objekt zugreifen, aber wenn ich den Code ändere, funktioniert es gut, aber ich möchte wissen, was das Problem ist. Ich glaube, mein Verständnis ist falsch bezüglich Umfang und Direktiven.

innerhalb einer Richtlinie ich Zugriff auf ein Array und in scope.watch Funktion versuche ich das Array zuzugreifen, aber es funktioniert nicht

Code arbeiten

var currentScope=scope.mainList[scope.$index].list; 
//this will hit whenever any of the scope variable changes 
scope.$watch(function() { 
    var hasTrue, hasFalse; 
    angular.forEach(currentScope, function (v) { 
    if (v["isSelected"]) { 
     hasTrue = true; 
    } else { 
     hasFalse = true; 
    } 
    }); 
    if (hasTrue && hasFalse) { 
    iElement.attr('checked', false); 
    // iElement.addClass('greyed'); 
    } else { 
    iElement.attr('checked', hasTrue); 
    // iElement.removeClass('greyed'); 
    } 
}, true); 

dies nicht funktioniert

var currentScope=scope.mainList[scope.$index].list; 
//this will hit only when this corresponding scope variable changes 
scope.$watch(currentScope,function (newVal) { 
    var hasTrue, hasFalse; 
    angular.forEach(newVal, function (v) { 
    if (v["isSelected"]) { 
     hasTrue = true; 
    } else { 
     hasFalse = true; 
    } 
    }); 
    if (hasTrue && hasFalse) { 
    iElement.attr('checked', false); 
    // iElement.addClass('greyed'); 
    } else { 
    iElement.attr('checked', hasTrue); 
    // iElement.removeClass('greyed'); 
    } 
}, true); 

Ich brauche diesen zweiten Code, aber wenn ich eine der Variablen ändert, trifft sie nicht und es kommt undefiniert

bitte diesen Link unten überprüfen wird es mehr Idee geben .....

Code

+0

die Variable nicht zugänglich in der zweiten Code ist? – Jigar7521

+0

@ Jigar7521: Im ersten Code sehen wir den gesamten Bereich, aber in der zweiten nur das spezifische Array, aber dieses zweite trifft nicht, bitte überprüfen Sie meine Geige Sie werden das Problem verstehen – user3501613

+0

Sie sind ** nicht ** beobachten den gesamten Umfang in das erste Beispiel. Sie beobachten die bereitgestellte Funktion auf Änderungen ihres Rückgabewerts. Bitte lesen Sie hier über $ watch: https://docs.angularjs.org/api/ng/type/$rootScope.Scope. Es nimmt zuerst einen Ausdruck (entweder Zeichenfolge oder Funktion) und das zweite Argument ist der Listener (von eckig aufgerufen, wenn er Änderungen im Ausdruck erkennt). Sie könnten die Idee haben, dass Ihr Code für jede Änderung im Bereich aufgerufen wird, aber angular wird diese Funktion mehrmals aufrufen, um Änderungen im Ausdruck zu erkennen. – Tobi

Antwort

1

Erweiterung auf Kommentar des @ tobi, hier ist der empfohlene Weg, Ihre Uhr Funktion geschrieben haben:

var currentScope=scope.mainList[scope.$index].list; 
scope.$watch(function() { return currentScope; }, function (newVal) { 
    var hasTrue = false, hasFalse = false; 
    angular.forEach(newVal, function (v) { 
    if (v["isSelected"]) { 
     hasTrue = true; 
    } else { 
     hasFalse = true; 
    } 
    }); 
    if (hasTrue && hasFalse) { 
    iElement.attr('checked', false); 
    // iElement.addClass('greyed'); 
    } else { 
    iElement.attr('checked', hasTrue); 
    // iElement.removeClass('greyed'); 
    } 
}); 

Alternativ können Sie dies tun:

scope.currentScope=scope.mainList[scope.$index].list; 
scope.$watch('currentScope', function (newVal) { 
    var hasTrue = false, hasFalse = false; 
    angular.forEach(newVal, function (v) { 
    if (v["isSelected"]) { 
     hasTrue = true; 
    } else { 
     hasFalse = true; 
    } 
    }); 
    if (hasTrue && hasFalse) { 
    iElement.attr('checked', false); 
    // iElement.addClass('greyed'); 
    } else { 
    iElement.attr('checked', hasTrue); 
    // iElement.removeClass('greyed'); 
    } 
}); 
+0

danke..sein gut funktioniert das Problem mit meinem vorherigen Code ist, wenn jede Änderung in einem der Umfang wird diese Uhr Funktion jetzt treffen dieses Problem gelöst .... – user3501613

+0

können Sie erklären Warum dieser eine Bereich. $ watch (currentScope, function (newVal) {} funktioniert nicht – user3501613

+0

@user funktioniert nicht, weil Sie der $ watch nicht wirklich einen Ausdruck liefern. Sie liefern ein bereits ausgewertetes Ergebnis, das sich nie ändert Die zwei Beispiele, die 2ps gaben, stellen die zwei Möglichkeiten dar. Entweder stellen Sie eine Zeichenfolge bereit, die einen Ausdruck enthält, der innerhalb des aktuellen Bereichs ausgewertet werden kann (entweder logisch oder nur der Name eines Objekts wie oben), oder Sie stellen eine Funktion bereit , das wird multiples mal von angular.Nachdem der Rückgabewert sich von Ausdruck oder Funktion ändert, wird angular Ihren Hörer aufrufen. – Tobi

Verwandte Themen