AngularJS - ng-model在contentitable <span>上失败
AngularJS - ng-model fails on contenteditable <span>
我正在学习AngularJS。我遇到了一些我无法解释的事情,也找不到任何解释(或解决方法)。
我有一个简单的AngularJS应用程序,我试图将<span contenteditable="true">
绑定到一个值,但它不起作用。如:
<!-- Works as expected -->
<input data-ng-model="chunk.value"></input>
<!-- Shows value, but doesn't bind - changes not reflected in model -->
<span contenteditable="true">{{chunk.value}}</span>
<!-- This is empty -->
<span contenteditable="true" data-ng-model="chunk.value"></span>
我如何使最后一个span使用双向绑定,这样编辑它的值更新块。价值,反之亦然?
ng-bind!在'span'中使用ng-bind进行单向绑定。
请参考这里的例子:https://docs.angularjs.org/api/ng/directive/ngBind
所以你的行应该是:<span contenteditable="true" ng-bind="chunk.value"></span>
希望对您有所帮助
要使ng-model
与可满足的<span>
元素一起工作,请使用自定义指令:
app.directive('contenteditable', ['$sce', function($sce) {
return {
restrict: 'A', // only activate on element attribute
require: '?ngModel', // get a hold of NgModelController
link: function(scope, element, attrs, ngModel) {
if (!ngModel) return; // do nothing if no ng-model
// Specify how UI should be updated
ngModel.$render = function() {
element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
};
// Listen for change events to enable binding
element.on('blur keyup change', function() {
scope.$evalAsync(read);
});
read(); // initialize
// Write data to the model
function read() {
var html = element.html();
// When we clear the content editable the browser leaves a <br> behind
// If strip-br attribute is provided then we strip this out
if (attrs.stripBr && html === '<br>') {
html = '';
}
ngModel.$setViewValue(html);
}
}
};
}]);
用法:
<span contenteditable ng-model="userContent">Change me!</span>
<p>{{userContent}}</p>
有关详细信息,请参见
- AngularJS
- AngularJS开发者参考-创建自定义指令
ngModelController
API参考-自定义控件示例演示
angular.module('customControl', ['ngSanitize'])
.directive('contenteditable', ['$sce', function($sce) {
return {
restrict: 'A', // only activate on element attribute
require: '?ngModel', // get a hold of NgModelController
link: function(scope, element, attrs, ngModel) {
if (!ngModel) return; // do nothing if no ng-model
// Specify how UI should be updated
ngModel.$render = function() {
element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
};
// Listen for change events to enable binding
element.on('blur keyup change', function() {
scope.$evalAsync(read);
});
read(); // initialize
// Write data to the model
function read() {
var html = element.html();
// When we clear the content editable the browser leaves a <br> behind
// If strip-br attribute is provided then we strip this out
if (attrs.stripBr && html === '<br>') {
html = '';
}
ngModel.$setViewValue(html);
}
}
};
}]);
[contenteditable] {
border: 1px solid black;
background-color: white;
min-height: 20px;
}
<script src="//unpkg.com/angular/angular.js"></script>
<script src="//unpkg.com/angular-sanitize/angular-sanitize.js"></script>
<body ng-app="customControl">
<span contenteditable ng-model="userContent">Change me!</span>
<hr>
Content={{userContent}}
</body>
ngModel
不会像@VtoCorleone指出的那样工作。ngModel文档
The ngModel directive binds an input,select, textarea (or custom form control) to a property on the scope using NgModelController, which is created and exposed by this directive.
你可以看一下contentitable指令。
否则,可能的解决方法:有一个被调用的函数。然后,该函数更新控制器中的$scope.chunk.value
。当绑定更新时,它会处理其他元素的内容。
我不确定你要的确切外观或功能,但只要把它放在<textarea>
和样式它看起来像<span>
(没有边框或背景等)。然后,当它在focus
中时,您添加额外的样式以确保它可以被编辑。这种方式将允许您按照预期使用ng-model
。下面是该方法的基本实现:Plunker
ng-model
不能与span
一起使用。如果你绝对需要,你可以为此编写一个自定义指令。该指令将在contentEditable
span
上设置keydown,keyup
监听器,并更新范围模型(在$apply()
内)。这将绑定span内容到模型。
我很快为你创建了一个plunker。看看吧。它将<span>
内容同步到范围模型。打开浏览器控制台,以便在键入内容时查看作用域模型的更新。
通过将ng-model-options="{ getterSetter: true }"
行为添加到附加了ng-model
的元素中。您也可以将ng-model-options="{ getterSetter: true }"
添加到<form>
中,这将为其中的所有<input>s
启用此行为。
示例显示了如何使用ngModel
和getter/setter
:演示页面
- 使用Clipboard.js复制span文本
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 将<span样式>凯迪托
- 兰吉 |如何在 span 标签上使用单击事件删除突出显示的文本
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- 当DIV中的文本高亮显示时,如何获得DIV中Span的值?(Javascript)
- jQuery.getJSON失败,语法错误
- 使用Javascript从整个网页中删除具有特定类的所有span标记
- Javascript/jQuery:用HTML span标记替换单引号中的文本
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- 使用Javascript更改Nested Span类