2014-10-22 35 views
2

我創建了一個自定義指令,其中包含一個隔離範圍,該範圍與封閉控制器中的函數以及對templateUrl的引用進行綁定。這裏是我的代碼如下所示:帶有templateUrl的指令中的函數參數

的HTML

<div ng-controller='MyCtrl as my'> 
    <custom-directive data='my.data' on-search="my.find(param1, param2)"></custom-directive> 
</div> 

指令

app.directive('customDirective', function() { 

    return { 
     restrict : 'E', 
     scope : { 
      data : '=data' 
      search : '&onSearch', 
     }, 
     templateUrl : 'customDirective.html' 
    }; 
}); 

模板

<div> 
    <input ng-model='data.id'> 
    <a ng-click='find(param1, param2)'></a> 

</div> 

按功能find收到的參數也存儲在data。控制器data綁定到指令而不是函數。我的日誌裏面的功能甚至不會顯示。

看來有很多不同的方法可以做到這一點,正如我在許多例子中看到的(見下文),但似乎沒有一個適用於我的案例。

實施例1:通過在模板

<div> 
    <input ng-model='data.id'> 
    <a ng-click='find.({param1: data.value1, param2: data.value2})'></a> 

</div> 

實施例2參數和值的映射:把一個鏈接在該指令

app.directive('customDirective', function() { 

    return { 
     restrict : 'E', 
     scope : { 
      data : '=data' 
      search : '&onSearch', 
     }, 
     templateUrl : 'customDirective.html', 
     link : function(scope, elem, attr) { 
      scope.retrieve({param1: scope.data.value1, 
          param2: scope.data.value2}); 
     } 

    }; 
}); 

實施例3:使用範圍$申請() ,$解析鏈接,但還沒有嘗試過

有人可以告訴我怎麼做,也可以向我解釋link部分(我不明白那部分),如果你感覺生成如圖所示,顯示工作的替代方案。由於

+0

(1)'find。(stuff)'是錯誤的語法 - 點不應該在那裏。 (2)在指令的範圍內是否有一個函數'find'?從設置中,該功能被稱爲「搜索」。 – 2014-10-22 09:33:59

+0

@NikosParaskevopoulos(1)更正了'。',這只是一個錯字(2)函數find在控制器中,我將它作爲指令的搜索。 – menorah84 2014-10-22 09:40:32

回答

2

您不必過時了你的函數只是參考PARAMS所以在你的HTML

<custom-directive data='my.data' on-search="my.find"></custom-directive> 

和你的模板指令直接調用

<div> 
    <input ng-model='data.id'> 
    <a ng-click='find(data.value1, data.value2)'></a> 
</div> 

我也建議你使用$範圍而不是控制器。所以,在你的控制器定義

$scope.data = { 
    id: 1, 
    value1: "value1", 
    value2: "value2" 
} 

$scope.find = function (param1, param2) { 
    //Your logic 
} 

且模板中直接就把

<custom-directive data='data' on-search="find"></custom-directive> 

我希望這回答你的問題

關於鏈接本文從角的js文檔是很清楚,我認爲

想要修改DOM的指令通常使用鏈接選項。 鏈接帶有以下簽名的功能,功能 鏈接(範圍,元素,attrs){...}其中:

範圍是一個角度範圍對象。元素是jqLit​​e包裝的

此指令匹配的元素。 attrs是一個具有標準化屬性名稱及其對應屬性值的鍵值對的散列對象。

在我們的紐帶作用,我們要更新 顯示的時間每秒一次,或每當用戶改變了我們的指令結合的時間 格式化字符串。我們將使用 $ interval服務定期調用處理程序。與使用$ timeout相比,這更容易 ,但在端到端測試 中效果更好,我們希望確保所有$超時在完成測試之前已完成 。如果 指令被刪除,我們也想刪除$ interval,所以我們不會引入內存泄漏。

+0

我沒有使用'$ scope'。我正在使用'var self = this; self.methodName = function ...'來公開我的控制器方法。你的建議似乎工作,如果我使用'$範圍',但不是我目前的設置。我將不得不改變太多的東西,包括那些如果我改變到'$ scope'的話,我就不會工作的東西。任何想法如何使用'this.methodName'來完成這項工作? – menorah84 2014-10-22 11:04:33