我正在編寫一個自定義的<pagination>
指令,它將返回負責更改當前頁面和分頁設置(例如每頁顯示多少項)的元素。該指令具有隔離範圍(使其更加可重用)。在Angular指令的隔離範圍內定義函數
在指令模板中,我需要調用諸如changePage()
或changePaginationSettings()
之類的函數。在我目前發現的隔離範圍內傳遞函數的唯一方法是在控制器中定義函數。
mainController.js
module.controller("mainController", function($scope) {
$scope.changePage = function() { ... };
});
,然後將它傳遞到指令作爲一個屬性:
pagination.js
module.directive("pagination", function() {
return {
restrict: "E",
scope: {
changePage: "="
},
templateUrl: "templates/pagination.html"
}
}
pagination.html
<pagination change-page="changePage">
這對我來說看起來非常難看,因爲它將相關代碼拆分爲2個不相關的文件。即changePage()
函數應該定義在pagination.js文件中,而不是mainController.js。
我倒是覺得這樣的事情應該是可能的:
pagination.js
module.directive("pagination", function() {
function changePage() { ... };
return {
restrict: "E",
scope: {
changePage: changePage
},
templateUrl: "templates/pagination.html"
}
}
但這樣的代碼產生(無意義對我)的錯誤:Error: definition.match is not a function
。
有沒有辦法做到這一點?我的意思是在隔離的指令範圍內傳遞同一個文件中定義的函數。
我讀過AngularJS Directive Docs但他們甚至沒有列出什麼是一個指令scope
對象合法值,只給一些「=」,「&」和「@」的例子。
因此,無法在指令本身內定義新的範圍值,對嗎?順便說一句,我不明白如何允許這會違反*隔離範圍*概念。使用服務的解決方案似乎比定義控制器內的值要好得多。感謝您提出建議。 –
你可以使用指令的'$ scope'做任何你喜歡的事情,唯一的區別就是該指令繼承了你自己定義的屬性,而不是其他的。像在控制器中一樣訪問一個指令的'$ scope',例如:'link:function(scope,elem,attrs){...}' – sdgluck
我在我之前的評論中以錯誤的方式提出了這個問題。我的意思是:「所以沒有辦法在指令中定義一些新的值 - 指令中可用的唯一值是通過屬性**和**傳遞給它的值明確地綁定到隔離範圍我。」 –