Jak zrobić filtrowanie dwukierunkowe w AngularJS?

Jedną z ciekawych rzeczy, jaką może zrobić AngularJS, jest zastosowanie filtru do określonego wyrażenia powiązania danych, co jest wygodnym sposobem zastosowania, na przykład, specyficznej dla kultury waluty lub formatowania daty właściwości modelu. Miło jest również mieć obliczone właściwości w zakresie. Problem polega na tym, że żadna z tych funkcji nie działa w dwukierunkowych scenariuszach wiązania danych - tylko jednokierunkowe powiązanie danych z zakresu do widoku. To wydaje się być rażącym pominięciem w znakomitej bibliotece - czy czegoś mi brakuje?

WKnockoutJS, Mógłbym utworzyć właściwość obliczoną do odczytu / zapisu, co pozwoliło mi określić parę funkcji, z których jedna jest wywoływana w celu uzyskania wartości właściwości, a druga jest wywoływana, gdy właściwość jest ustawiona. Pozwoliło mi to na przykład zaimplementować wejście zorientowane na kulturę - pozwalając użytkownikowi wpisać „$ 1,24” i przeanalizować to w float w ViewModel, i wprowadzić zmiany w ViewModel odzwierciedlone na wejściu.

Najbliższą rzeczą, jaką mógłbym znaleźć, jest użycie$scope.$watch(propertyName, functionOrNGExpression); Pozwala mi to wywołać funkcję, gdy właściwość w$scope zmiany. Ale to nie rozwiązuje, na przykład, problemu związanego z kulturą. Zwróć uwagę na problemy, gdy próbuję zmodyfikować$watched nieruchomość w obrębie$watch sama metoda:

$scope.$watch("property", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.property = Globalize.parseFloat(newValue);
});

(http://jsfiddle.net/gyZH8/2/)

Element wejściowy bardzo się myli, gdy użytkownik zaczyna pisać. Poprawiłem go, dzieląc właściwość na dwie właściwości, jedną dla wartości nieanalizowanej i jedną dla przeanalizowanej wartości:

$scope.visibleProperty= 0.0;
$scope.hiddenProperty = 0.0;
$scope.$watch("visibleProperty", function (newValue, oldValue) {
    $scope.outputMessage = "oldValue: " + oldValue + " newValue: " + newValue;
    $scope.hiddenProperty = Globalize.parseFloat(newValue);
});

(http://jsfiddle.net/XkPNv/1/)

To było ulepszenie w stosunku do pierwszej wersji, ale jest nieco bardziej gadatliwe i zauważ, że nadal istnieje problem zparsedValue właściwość zmian zakresu (wpisz coś w drugim wejściu, które zmieniaparsedValue bezpośrednio. zauważ, że najwyższe wejście nie jest aktualizowane). Może się tak zdarzyć w wyniku działania kontrolera lub ładowania danych z usługi danych.

Czy istnieje jakiś łatwiejszy sposób na zaimplementowanie tego scenariusza przy użyciu AngularJS? Czy brakuje mi niektórych funkcji w dokumentacji?

questionAnswers(1)

yourAnswerToTheQuestion