我正在構建一個包裝選擇列表的組件,該列表需要通過調用jQuery元素上的.chosen()進行初始化。我可以使用$ postLink生命週期回調來執行此操作,並且可以使用$('。chosen-select')。chosen(),這很好。但是,我可以預料到有人在同一頁面上使用組件的多個實例,因此使用類選擇器不一定會獲得所需的組件。
我嘗試使用id選擇器,而不是通過向HTML中某個組件賦予的id添加前綴。例如,我可以使用組件<chosen-select id="roles"></chosen-select>
和模板中的<select id="cs-{{$ctrl.id}}">
(在控制器中,我綁定id: '@'
)。這一切都按預期工作,除了在$ postLink中,select元素已經創建(和其他綁定,比如列出選項的那個綁定),但id仍然是「cs - {{$ ctrl.id}}」。什麼時候變成了「cs-roles」(當所有東西都已經建立時,它就是DOM中的東西)?確保我訪問屬於此組件的對象的最佳方法是什麼?
下面是部分代碼,它的工作原理:
模板:
<select id="cs-{{$ctrl.id}}" class="chosen-select"
ng-options="(option.name || option) for option in $ctrl.options track by (option.id || option)"
ng-model="$ctrl.result"
>
</select>
組件:
mymod.component('chosenSelect', {
templateUrl: 'shared/components/chosenSelectComponent.html',
controller: chosenSelectController,
bindings: {
id: '@',
options: '<',
config: '<?',
selected: '<?',
doChange: '&?'
}
});
function chosenSelectController() {
var vm = this;
vm.result = vm.selected || vm.options[0];
vm.$postLink = function() {
// would like to use ("#cscomp-" + vm.id) to make sure it is unique,
// but id doesn't seem to have been resolved yet in select element
$(".chosen-select")
.chosen(vm.config)
.on('change', function(evt, params) {
// parms.selected also holds result
vm.doChange({ value: vm.result });
});
};
}