我正在編寫一個包裝輸入字段的指令,並在整個應用程序中添加了我想要的一些標準功能。我將輸入元素轉換爲我的指令模板,將ng-focus
和其他屬性添加到輸入字段,之後將其轉換爲包裝指令。現在,模板加載正確,但範圍方法不會觸發註冊的事件處理程序。我的代碼迄今:Trancluded指令和ngModelCtrl上的自定義屬性
的Transcluded指令
editInput.$inject = ['$parse'];
function transcludedDir($parse) {
return {
require: ['^wrapperDir', 'ngModel'],
restrict: 'A',
template: function(tElem, tAttrs) {
tElem.attr('ng-key-enter', 'onInputSave()');
return tElem;
},
link: function($scope, element, attrs, ctrls){
ctrls[0].setNgModel(ctrls[1]);
ctrls[0].modelSetter(function(value){
$parse(atrs['ngModel'])($scope, value);
});
$scope.onInputSave = ctrls[0].save;
}
};
}
包裝指令(推在某些按鈕,代表一個保存功能等)
wrapperDir.$inject = ['$q'];
function wrapperDir($q) {
return {
transclude: true,
restrict: 'E',
scope: {
onSave: '&'
},
templateUrl: 'template.tpl.html',
controller: function($scope){
var modelCtrl;
var initialValue;
var updateValue;
this.setNgModel = function(ngModel){
modelCtrl = ngModel;
initialValue = modelCtrl.$modelValue;
};
this.modelSetter = function(setterFunction){
updateValue = setterFunction;
};
this.save = $scope.save = function save(){
var currentValue = modelCtrl.$modelValue;
var result = $scope.onSave({
currentValue: currentValue,
initialValue: initialValue
});
$q.when(result).then(function(res) {
initialValue = currentValue;
});
};
return this;
}
};
}
的包裝DIR模板和樣本用法。包裝指令模板是很簡單的,我只是裝飾用輸入到transcluded-dir
確保了transclusion鏈接掛接的特殊屬性等用途會是這個樣子:
<!-- template.tpl.html -->
<div>
<!-- Input is jammed in here via transclusion -->
<div ng-transclude></div>
<div><!-- actions i want to append (buttons, etc) --></div>
</div>
<!-- Sample usage -->
<wrapper-dir on-save="mySaveFn()">
<input transcluded-dir type='text' ng-mode="my_little_teapot"
</wrapper-dir>
ng-key-enter
執行上輸入一個動作在輸入字段中,但transcluded作用域中的onInputSave方法永遠不會觸發。有任何想法嗎?如果你做到這一點,請提前致謝。