2015-11-25 15 views
1

如果元素的屬性包含多個角度表達式,那麼這些表達式將計算爲空字符串。在我的例子中,我有一個具有2個相同表達式的屬性,它們都只是輸出範圍變量。如果我刪除一個表達式,那麼另一個表達式正確計算。我錯過了什麼?從控制器爲什麼角色表達式計算爲屬性中的空字符串

提取物:從我的HTML

link: function (scope, elem, attrs) { 
     scope.$watch("dataRead", function (dataAvailable) { 
      if (dataAvailable) { 
       ...here I check for mytest attribute value... 

提取物::

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

在上面的例子中,如果mytest的具有表達兩次從該指令

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

提取物結果值是一個空字符串,否則它正確評估。 因此,基本上一旦同一個屬性值中有超過1個範圍變量表達式,它就無法評估。

急需幫助!

編輯:

道歉編輯遲到。這是顯示問題的plunker。 index.html頁面中有一個屬性myattr。它故意將它的值設爲兩個相同的表達式。在指令的鏈接函數中,該屬性的值是一個空字符串。

+0

代碼不完整。我們不知道指令是如何定義的,應該評估什麼,評估顯示在什麼地方等等。發佈一個完整的最小范例來重現問題。解釋你期望發生什麼,以及發生了什麼。 –

+0

創建一個plunkr/jsbin /隨你的問題。它在這一個工作正常:http://jsbin.com/mupuhi/1/edit?html,js,output – sirrocco

+0

是的,抱歉沒有給你足夠的信息和延遲響應。以下是具有可重複條件的plunkr:[鏈接](http://plnkr.co/edit/svZtSp00DaGK3HWUYB7R?p=preview) 正如您所見,span元素可以正確評估,但如果您查看其設置的myattr屬性以空字符串 - 一個警告框顯示 – Nikolai

回答

2

您的代碼有兩個問題。

首先,正如我在Angular directive fields not require brackets中所說的。指令字段中的雙花括號會導致問題。您應該使用Angular表達式。

有問題的HTML

<body ng-controller="myViewCtrl"> 
         <!-- this is a problem --> 
    <my-directive myattr="{{mytest}}{{mytest}}"></my-directive> 
    <span>{{mytest}}{{mytest}}</span> 
</body> 

而是使用:

<body ng-controller="myViewCtrl"> 
    <my-directive myattr="mytest+mytest"></my-directive> 
    <span>{{mytest}}{{mytest}}</span> 
</body> 

第二問題

要查看屬性的計算值,你需要使用範圍的$eval方法。

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

要了解更多關於$eval方法,請參閱AngularJS $rootScope.Scope API Reference

注意,以饗讀者

的指令ng-srcng-srcset,並且ng-href插值和雙大括號工作。大多數其他屬性指令使用$eval來評估Angular表達式,並且不能使用雙括號。

雙花括號有時在指令中工作,有時是必要的。這取決於指令是如何實施的。所以最終的答案取決於。

+0

感謝@georgeawg示例,但它是無關的。在原文中看到我的評論。 – Nikolai

+0

@Nikolai用你的代碼編輯和修改了答案 – georgeawg

+0

就是這麼簡單! : - $ Das ist fantastische !!!謝謝,我的朋友!去掉大括號並使用$ eval進行評估很好地完成了這項工作! – Nikolai

相關問題