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