2015-03-17 14 views
5

Jestem faktoringu niektóre widżet i wyrażenie $watch działa doskonale, mając wszystko w jednym pliku, ale teraz przeniosłem odpowiednią część kontrolera do nowego kontrolera i znaczników do nowego html i $watch strzela dokładnie raz po inicjalizacji, ale nie kiedy edytowanie wpisywania powiązanych danych wejściowych.

JS:

app.controller('getRecipientWidgetController', [ '$scope', function($scope) { 
    console.log("controller initializing") 
    var testReceivingAddress = function(input) { 
     console.log("change detected") 
    } 
    $scope.$watch("addressInput", testReceivingAddress) 
} ]) 

HTML owijki:

<ng-include 
    src="'partials/getRecipientWidget.html'" 
    ng-controller="getRecipientWidgetController" 
    ng-init="recipient=cert"> <!-- ng-init doesn't influence the bug. --> 
</ng-include> 

HTML partials/getRecipientWidget.html:

<md-text-float ng-model="addressInput"></md-text-float> 

Podejrzewam, że jest jakiś zakres voodoo dzieje? Opuściłem ng-init, aby jasno określić, co chcę osiągnąć: zbudować oczywiście bardziej złożony, wielokrotnego użytku widget, który w tym przypadku będzie działał pod numerem $scope.cert jako jego recipient.

+0

tylko dla chichotów, co się dzieje, gdy wstrzyknąć rootscope i nazywają $ oglądać na ten temat? – lintmouse

+0

@dustmouse bez zmian. Dokładnie ten sam błąd/zachowanie. – Giszmo

+0

Jak powiedział floribon w swojej odpowiedzi, dowiedz się o tzw. "Regule punktowej". – Blackhole

Odpowiedz

7

To prawdopodobnie dlatego ng-include stworzy nowy odziedziczony zakresu od załączonego HTML, stąd $scope.addressInput w kontrolerze nie to samo odniesienie jako $scope.addressInput w getRecipientWidget.html

Więc to nie jest łatwe do wyjaśnienia, ale należy też umieścić ng-controller w kodzie HTML getRecipientWidget.html (a nie na powyższym div, który obejmuje) LUB można użyć obiektu, takiego jak something.addressInput zamiast surowego addressInput, co pozwala uniknąć problemów z odniesieniami na surowych typach (liczba/ciąg).

+0

Tak! Dziękuję za tonę! "coś" zaczęło tutaj działać. :) Nie jestem pewny, które z twoich rozwiązań wybrać, ale o wybór jest ładniejszy problem niż mój błąd :) – Giszmo

+0

Wybierz drugi. Używanie notacji kropek jest uważane za najlepszą praktykę w AngularJS, a robienie tego konsekwentnie oznacza, że ​​nie będziesz miał tego błędu, aby cię ugryźć (lub twój kolega, który zmieniłby kod HTML) – Greg

+0

Właśnie przetestowałem pierwszy i nauczony (możesz to rozwinąć/dodać do swojej odpowiedzi), że oba kontrolery zakończyły działanie w tym samym zakresie. Pójdzie z 'coś' i dwoma zakresami (?). – Giszmo

3

ng-include tworzy nowy zakres.

Spróbuj

<md-text-float ng-model="$parent.addressInput"></md-text-float> 

Plunker example

+0

Dziękuję, ale myślę, że floribon wykonał dobrą robotę przy wyjaśnianiu co się dzieje. Używanie '$ parent' prawdopodobnie będzie trzecią opcją. – Giszmo

Powiązane problemy