2014-12-23 51 views
0

我有一個指令,其中一個項目列表(數組)通過控制器的範圍傳遞到指令的作用域中,從而指令的模板可以訪問項目。傳入一個指令而不添加到範圍

我想擁有它,以便將項目列表傳遞給指令(然後在鏈接函數中使用它),然後不能通過指令的模板直接訪問。

即如果我們有以下指令:

directive('itemList', function(){ 
return { 
    scope: { 
     items: '=' 
    } 
    link: function(scope, elem, attrs){ 
     var item-list = scope.items; 
     // ... want to manipulate first ... 
    } 
} 
}) 

變量scope.items現在可用於該指令使用任何模板。儘管我不希望這樣做,並希望將某些內容傳遞給指令,但不會將其告知範圍。這可能嗎?

回答

1

由於定義範圍非常符合定義,它是指令模板使用的範圍,我沒有看到以嚴格的信息隱藏方式執行此操作的任何明顯方式。但是,爲什麼不爲傳入的範圍變量和模板綁定的內容使用不同的名稱?例如,如果您說scope: { myPrivatePassedItems: '=items' },則現在可以根據需要使用scope.myPrivatePassedItems,然後將其設置爲scope.items。通過這種方法,指令和指令模板中的HTML都可以看到「項目」,但在內部,您的指令具有自己的「私有」變量。

我應該補充一點,以上是從消費者到指令模板的單向數據流所需的簡單更改。如果您還需要更新原始項目數組,則還需要在完成初始設置後在scope.items陣列上添加scope.$watch。然後,您需要將這些更改(可能進行修改)返回到scope.myPrivatePassedItems以更新用戶的陣列。

+0

這是我去的方法。 – Titus

1

您可以使用$parse service來檢索該值而不使用scope: {},但是您將失去使用scope: { items: '=' }固有的雙向數據綁定。正如Dana Cartwright所說,如果你需要2路綁定,你必須用手錶手動設置。

directive('itemList', function($parse){ 
    return { 
     link: function(scope, elem, attrs){ 
      var itemList = $parse(attrs['items'])(scope); 

      // do stuff with itemList 
      // ... 
      // then expose it 
      scope.itemList = itemList; 
     } 
    }; 
}); 
相關問題