我的输入上有ng-change
,然后我将其更改为contenteditable
div,因此我可以更多地控制我可以对输入做些什么。但问题是,当我从输入更改为div时,我无法再使用ng-change
。我能做些什么来获得相同的效果/结果?
以下是我在模板中使用它的方法:
<div class="form-control" ng-model="search" ng-change="searchChanged()" contenteditable="true">{{seach}}</div>
答案 0 :(得分:8)
为了支持ng-model
ng-change
除了表单元素以外的任何内容,您需要创建一个自定义指令。例如,一个名为contenteditable
的指令下面的简单实现(非常类似于具有input
,form
等内部指令的angular,它需要ng-model
并且{{1} event设置viewvalue并渲染ng-model。如果keyup
setViewValue
且值与prev值不同,则角度将评估ng-model
表达式。
ng-change
并且做:
.directive('contenteditable', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attr, ngModel) {
function updateViewValue() {
ngModel.$setViewValue(this.innerHTML);
}
//Binding it to keyup, lly bind it to any other events of interest
//like change etc..
elm.on('keyup', updateViewValue);
scope.$on('$destroy', function() {
elm.off('keyup', updateViewValue);
});
ngModel.$render = function(){
elm.html(ngModel.$viewValue);
}
}
}
});
<div class="form-control" type="search"
ng-model="seach" ng-change="searchChanged()"
contenteditable="true"></div>
&#13;
angular.module('app', []).controller('ctrl', function($scope) {
$scope.seach = "Initial";
$scope.searchChanged = function() {
console.log('changed', $scope.seach);
}
}).directive('contenteditable', function() {
return {
require: 'ngModel',
restrict: 'A',
link: function(scope, elm, attr, ngModel) {
function updateViewValue() {
ngModel.$setViewValue(this.innerHTML);
}
//Or bind it to any other events
elm.on('keyup', updateViewValue);
scope.$on('$destroy', function() {
elm.off('keyup', updateViewValue);
});
ngModel.$render = function() {
elm.html(ngModel.$viewValue);
}
}
}
});
&#13;
答案 1 :(得分:1)
ng-change仅适用于输入而不是div。尝试点击。
有关实现自定义指令以将模型绑定到可信任div的示例,请参阅here。
答案 2 :(得分:0)
您不能将ng-change添加到div元素,因为它不是数据源。但您可以编写自定义指令来处理自定义ng-change实现。
答案 3 :(得分:0)
// usage
<div ng-model="val" onChange="fireEvent(val)"></div>
// implementation
angular.module('app',[]).directive('contenteditable', [function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
function read() {
ngModel.$setViewValue(element.html());
}
ngModel.$render = function() {
element.html(ngModel.$viewValue || '');
};
element.bind('blur keyup change', function() {
scope.$apply(function(){
read();
attrs.onChange(ngModel.$viewValue)
});
});
}
};
}]);
试试这个。这是我自己的实现。
答案 4 :(得分:0)
假设您的指令链接功能如下所示:
link: function ($scope, element, attrs, ngModel) {
然后你可以将viewChangeListener附加到ngModel。
ngModel.$viewChangeListeners.push(function() {
$scope.$eval(attrs.ngChange);
});
答案 5 :(得分:0)
ng-change仅在输入从js更改时才起作用。因此ng-change仅适用于输入标签。 将自定义指令应用于div可能会解决您的问题。