2013-02-04 40 views
30

我試圖將數組獲取到模板中,以便可以使用其中的個人值。我的問題是該屬性在我的模板中變成一個字符串,因此不再以{{var [0]}}的形式訪問,而是返回「字符串」的第一個字符,通常是「[」將數組綁定到AngularJS中的指令變量

下面是數據的簡化設置:

"varForward": ["100", "1"], 
"varBack": ["1", "100"] 

下面是與該數據交互的HTML文件的簡化部分:

<my-customer-vars value="{{varForward}}"> 
    </address-numbers> 
<my-customer-vars value="{{varBack}}"> 
    </address-numbers> 

,最後這裏是應該更換的部分自定義標籤:

directive('myCustomerVars', function($compile) { 
    return { 
     restrict: 'E', 
     scope: { 
      value: "@" 
     }, 
     template: 
     '<div>'+ 
      '<p class="body-text">Some stuff goes here</p>'+ 
      '<input type="text" name="firstinput" value="{{value[0]}}"> - '+ 
      '<input type="text" name="secondinput" value="{{value[1]}}">'+ 
     '</div>', 
     replace: true 
    } 
}); 

所以我在這裏,如果我嘗試使用值[0]我得到[如果我嘗試獲得價值[1]我得到「等等。有沒有在指令模板內使用數組的幫助?

回答

43

您需要更改 「@」 到 「=」 和數組中傳遞,而不{{}}

這樣的:

<my-customer-vars value="varForward"> 
    </my-customer-vars> 
<my-customer-vars value="varBack"> 
    </my-customer-vars> 

指令:

directive('myCustomerVars', function($compile) { 
    return { 
     restrict: 'E', 
     scope: { 
      value: "=" 
     }, 
     template: 
     '<div>'+ 
      '<p class="body-text">Some stuff goes here</p>'+ 
      '<input type="text" name="firstinput" value="{{value[0]}}"> - '+ 
      '<input type="text" name="secondinput" value="{{value[1]}}">'+ 
     '</div>', 
     replace: true 
    } 
}); 

發生這種情況的原因是,由@定義的directuve屬性中的每個表達式都只被評估爲一個字符串,並且以另一種方式被評估爲綁定表達式。 (2路綁定,所以要小心)。

+1

謝謝,工作完美!我對範圍變量並不完全熟悉,但這幫助我清除了很多問題,包括如何使用它們。 – Organiccat

+0

既然我們傳遞的是模型而不是值,我建議'model =「varForward」'然後'scope:{model:'='}'。 –

+0

@ShaiRez這是採取數組並將其放入模板中的最佳方式?我很想知道是否有其他選擇。 –

16

如果您不想創建該指令的分離範圍(創建自定義的驗證指令時,例如),你可以通過該數組爲:

<my-customer-vars model="varForward"> 

然後閱讀的邏輯函數值指令爲:

directive('myCustomerVars', function($compile) { 
    return { 
     restrict: 'E', 
     link: function (scope, elm, attrs, ctrl) { 
      var myVars = scope[attrs.model]; // <--- took a time to figure out 
      console.log(myVars); 
     } 
    } 
}); 
+1

這並不適用於我。 attrs.model未定義。 – greg

+1

@greg這個回覆來自很久以前,我想說的是Angular 1.1或1.2的時間。也許它在新版本中不起作用。我不再使用Angular。 – Danita

+0

它仍然適用於較新的版本。 –

6

只需添加到Danita的回覆,你將不得不使用$eval用於讀取此範圍變量:

只要改變

var myVars = scope[attrs.model]; 

var myVars = scope.$eval(attrs.model); 
+1

謝謝。我希望在文檔中更好地解釋這一點。 – taco