2015-06-12 9 views
9

w punkcie w moim html robię takie rzeczy:Specjalne znaki w zmiennej kątowej znajduje się w pliku HTML

<li ng-repeat="favorite in favorites track by $index"> 
    <a ng-href="javascript:void(0)" ng-click="changeSVG(favorite)"> 
    <i class="fa fa-sitemap"></i>{{favorite}} 
    </a> 
</li> 

Problem polega na tym, że czasami favorite w ng-click="changeSVG(favorite)" zawiera znaki specjalne jak '. Tak więc pojawiają się błędy w konsoli:

Error: [$parse:lexerr] http://errors.angularjs.org/1.3.14/ $parse/lexerr?p0=Unterminated%20quote&p1=s%2042-44%20%5B')%5D&p2=changeSVG('Process%20passageNaN'ordre%20MOB') at Error (native)

Jak mogę temu zapobiec?

Słyszałem o $ sce, kiedy się nad tym zastanawiałem, ale nie jestem pewien, czy pasuje on do moich potrzeb i jak używać go w moim kontrolerze.

Oto changeSVG() funkcja:

$scope.changeSVG = function (svgName) { 
    var defaultZoom = getZoomFromCarto(svgName); 

    $scope.currentCartography = svgName; 
    $scope.currentZoom = defaultZoom; 
    if ($scope.cartoHistory.indexOf(svgName) != -1) 
     $scope.cartoHistory.splice($scope.cartoHistory.indexOf(svgName), 1); 
    $scope.cartoHistory.unshift(svgName) 
    if ($scope.cartoHistory.length > 20) 
     $scope.cartoHistory = $scope.cartoHistory.slice(0, 20); 

    localStorage.setItem("cartoHistory", JSON.stringify($scope.cartoHistory)); 
    removeEmbed(); 
    var svgPath = "SVG/" + $scope.currentLanguage + "/" + svgName + ".svg"; 
    lastEmbed = createNewEmbed(svgPath, defaultZoom); 
} 

próbowałem wyświetlić svgPath w dzienniku, współpracuje z normalnych plików, ale gdy próbuję z moim pliku z (spacja) i ' w swojej nazwa, nic nie jest wyświetlane.

+0

próbowałeś 'changeSVG (favorite.toString()) lub' 'favorite.replace jak regex (/ \ '/ g, "\'") '? – Freezystem

+0

Dobry pomysł, właśnie go wypróbowałem, ale nie działało – Ellone

+1

i że: 'favorite.replace (/ \ '/ g," ' ")' lub '$ sce.trustAsHtml (ulubione)' – Freezystem

Odpowiedz

1

Problem występuje, ponieważ Angular zastępuje ten favorite w swoim wywołaniu funkcji przez ciąg znaków. Rozwiązaniem może być użycie $index jako parametru funkcji, dzięki czemu możesz odczytać z tablicy favorites kod kontrolera, dodając dowolną weryfikację, której możesz potrzebować. I nie pojawi się magia zastępująca ciągi smyczkowe.

coś takiego:

Szablon:

<li ng-repeat="favorite in favorites track by $index"> 
    <a ng-href="javascript:void(0)" ng-click="changeSVG($index)"> 
    <i class="fa fa-sitemap"></i>{{favorite}} 
    </a> 
</li> 

Kontroler:

$scope.changeSVG = function (index) { 
    // Add any validation logic here. 
    var svgName = favorites[index]; 

    var defaultZoom = getZoomFromCarto(svgName); 

    $scope.currentCartography = svgName; 
    $scope.currentZoom = defaultZoom; 
    if ($scope.cartoHistory.indexOf(svgName) != -1) 
     $scope.cartoHistory.splice($scope.cartoHistory.indexOf(svgName), 1); 
    $scope.cartoHistory.unshift(svgName) 
    if ($scope.cartoHistory.length > 20) 
     $scope.cartoHistory = $scope.cartoHistory.slice(0, 20); 

    localStorage.setItem("cartoHistory", JSON.stringify($scope.cartoHistory)); 
    removeEmbed(); 
    var svgPath = "SVG/" + $scope.currentLanguage + "/" + svgName + ".svg"; 
    lastEmbed = createNewEmbed(svgPath, defaultZoom); 
}