Angularjs 为什么角度表达式在属性中计算为空字符串

Angularjs 为什么角度表达式在属性中计算为空字符串,angularjs,scope,expression,Angularjs,Scope,Expression,当元素的属性包含多个角度表达式时,这些表达式的计算结果为空字符串。在我的示例中,我有一个具有两个相同表达式的属性,它们都只是输出范围变量。如果删除一个表达式,则另一个表达式的计算结果正确。我错过了什么 从控制器中提取: $http.get( "http://myurl/odata/Profile", { params: { "$orderby": "Id", "someParamId": "10" }

当元素的属性包含多个角度表达式时,这些表达式的计算结果为空字符串。在我的示例中,我有一个具有两个相同表达式的属性,它们都只是输出范围变量。如果删除一个表达式,则另一个表达式的计算结果正确。我错过了什么

从控制器中提取:

$http.get(
    "http://myurl/odata/Profile",
    {
        params: {
            "$orderby": "Id",
            "someParamId": "10"
        }
    }
).success(function (response) {
        $scope.data = response.value;
        $scope.mytest = "hello";
        $scope.dataRead = true;
    }
);
指令摘录:

    link: function (scope, elem, attrs) {
        scope.$watch("dataRead", function (dataAvailable) {
            if (dataAvailable) {
                ...here I check for mytest attribute value...
从我的html中提取:

     <my-directive id="someId" style="position: absolute; background-color:bisque;" width="200" mytest="{{mytest}}{{mytest}}"....

您的代码有两个问题

首先,正如我在书中所说。指令字段中的双花括号会导致问题。您应该使用角度表达式

有问题的HTML

<body ng-controller="myViewCtrl">
                      <!-- this is a problem -->
    <my-directive myattr="{{mytest}}{{mytest}}"></my-directive>
    <span>{{mytest}}{{mytest}}</span>
</body>
要了解有关
$eval
方法的更多信息,请参阅

读者须知

指令
ng src
ng srcset
ng href
是内插的,并使用双花括号。大多数其他属性指令使用
$eval
计算角度表达式,不适用于双花括号


双花括号有时在指令中起作用,有时是必要的。这取决于指令是如何实现的。因此,最终的答案是视情况而定。

代码不完整。我们不知道指令是如何定义的,应该评估什么,评估到什么地方,在哪里显示,等等。发布一个完整的最小示例来重现问题。解释你预期会发生什么,以及会发生什么。用你的问题创建一个plunkr/jsbin/随便什么。在这一点上它工作得很好:是的,很抱歉没有给你足够的信息和延迟回复。以下是具有可复制条件的plunkr:正如您所看到的,span元素确实正确计算,但如果您查看myattr属性,它被设置为空字符串-一个警报框显示感谢@georgeawg示例,但它与此无关。请看我在原始帖子中的评论。@Nikolai用你的代码中的剪贴和更正编辑了答案。真的很简单吗???:-$这是幻想!!!谢谢你,我的朋友!删除花括号并使用$eval进行评估很好地完成了这项工作!然而@georgeawg,只是出于兴趣,如果在then函数之外设置$scope.mytest,为什么相同的表达式会正确计算:
app.controller('myViewCtrl',函数($scope,jsonService){$scope.mytest='Bzzz';jsonService.getjson()。然后(函数(d){$scope.sourceData=d;$scope.loaded=true;});  });在plunker中尝试,您将看到myattr的计算结果是正确的,这是另一个问题。
<body ng-controller="myViewCtrl">
    <my-directive myattr="mytest+mytest"></my-directive>
    <span>{{mytest}}{{mytest}}</span>
</body>
app.directive('myDirective', function() {
  return {
    restrict: 'E',
    link: function(scope, elem, attrs) {
      scope.$watch("loaded", function(loaded) {
        if (loaded) {
          //Do this
          alert(scope.$eval(attrs.myattr));
          //Not this
          //alert(attrs.myattr);
        }
      });
    }
  }
});