【发布时间】:2015-04-28 09:15:50
【问题描述】:
我是 Angular 的新手,仍然痛苦地围绕着自定义指令。
我想重用这段 HTML
<ui-select ng-model="model.selectedLanguages" multiple search-enabled="true" theme="select2" style="width: 300px;">
<ui-select-match placeholder="Pick one...">{{$item.name}}</ui-select-match>
<ui-select-choices repeat="lang.id as lang in langs |filter: { name : $select.search }">
<div ng-bind-html="lang.name | highlight: $select.search" ></div>
</ui-select-choices>
</ui-select>
通过将其包装到我的自定义指令中:
<language-picker ng-model="model.selectedLanguages"/>
类似这样的:
app.directive('languagePicker', function() {
return {
template : '<ui-select ng-model="**PARENT'S NGMODEL**" multiple search-enabled="true" theme="select2" style="width: 300px;"><ui-select-match >{{$item.name}}</ui-select-match><ui-select-choices repeat="lang.id as lang in langs | filter: { name : $select.search }"><div ng-bind-html="lang.name | highlight: $select.search"></div></ui-select-choices></ui-select>',
restrict : 'E',
require : 'ngModel',
replace : true
....
};
});
但是如何将 ngModel 从我的 language-picker 传递给 ui-select 指令?
更新
使用下面的建议,我让它与 ui-select 一起工作,但外部模型根本没有更新,请参阅plnkr.co/edit/Y43dmMGIc5GxM9fLoNPW,可能是因为它的子范围和父范围保持不变?
更新 2
我让它以一种对我来说看起来很可怕的复杂方式工作,因为我不知道它为什么首先“工作”(请参阅控制器中发生的奇怪事情):
app.directive('languagePicker', function(LanguageService) {
return {
templateUrl : 'LanguagePickerTpl.html',
restrict : 'E',
scope : {
languages : '='
},
controller : function($scope, LanguageService) {
console.log($scope);
$scope.langs = LanguageService.get();
$scope.model = $scope;
}
};
})
模板:
<ui-select ng-model="model.languages" multiple search-enabled="true"
theme="select2" style="width: 300px;">
<ui-select-match>{{$item.name}}</ui-select-match>
<ui-select-choices repeat="lang.id as lang in langs | filter: { name : $select.search }">
<div ng-bind-html="lang.name | highlight: $select.search"></div>
</ui-select-choices>
</ui-select>
如果有人能解释发生了什么,我会非常高兴(“工作”示例在这里 http://plnkr.co/edit/B53F9sc7UGkj0uxUpC17 )
【问题讨论】:
-
如果我没记错的话,子作用域可以访问其父属性而不做任何事情。如果您关心可重用性,您可能应该遵循下面描述的答案,并通过子指令上的属性传递属性。
标签: javascript angularjs angularjs-directive