角度变量中的特殊字符位于HTML文件中

时间:2015-06-12 11:30:11

标签: javascript html angularjs encoding

在我的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>

问题是有时favorite中的ng-click="changeSVG(favorite)"包含'等特殊字符。所以我在控制台中收到这样的错误:

  

错误:[$ parse:lexerr] http://errors.angularjs.org/1.3.14/ $ parse / lexerr?p0 =未终止%20quote&amp; p1 = s%2042-44%20%5B&#39;)%5D&amp; p2 = changeSVG(& #39;进程%20passageNaN&#39;公共秩序%20MOB&#39;)       在错误(本机)

我该如何防止这种情况?

我在调查时听说过$ sce,但不确定它是否符合我的需求以及如何在我的控制器中使用它。

以下是changeSVG()功能:

$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);
}

我尝试在日志中显示svgPath,它可以正常使用普通文件,但是当我尝试使用名称中包含(空格)和'的文件时,不会显示任何内容。

1 个答案:

答案 0 :(得分:1)

当Angular用字符串替换函数调用中的favorite时,会出现问题。解决方案可以使用$index作为函数参数,因此您可以从控制器代码中的数组favorites读取,添加您可能需要的任何验证。并且不会发生角度替换魔法。

类似的东西:

模板:

<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>

控制器:

$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);
}