【发布时间】:2020-06-29 03:49:21
【问题描述】:
我在 gridController as gc 中有一个 ng-repeat,用于填充 Bootstrap 表:
<div ng-repeat="(id, task) in gc.modelFilter(model.getModelAsDict())">
<div ng-show="model.getTask(id).edit_active" class="row">
<div class="col-sm-12">
<button type="button" class="btn btn-danger" ng-click="showDeleteModal(id)">Delete</button>
<button type="button" class="btn btn-default" ng-click="gc.save(task)">Save</button>
<button type="button" class="btn btn-default" ng-click="gc.cancel(task)">Cancel</button>
</div>
</div>
<div class="row datacell" ng-class="{'active': model.getTask(id).edit_active}">
<div class="col-sm-1"><p contenteditable="true" ng-model="task.case_name"></p></div>
<div class="col-sm-1"><p contenteditable="true" ng-model="task.title"></p>
....
</div>
</div>
如果该任务的属性edit_active 设置为true,则ng-repeat 之后的div 用于有条件地显示一组按钮。如果该属性为真,ng-class 会向该行添加一个自定义类 active,如果该行有一个 active 类,我会使用 css 将该行设置为可编辑。
我有一个contenteditable 的自定义指令:
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(read);
});
function setRowActive(id) {
scope.model.getTask(id).edit_active = true;
}
element.bind("click", function() {
console.log('editing row id ' + scope.id);
scope.$apply(setRowActive(scope.id));
});
}
};
});
这一切都很好,因为它允许用户单击引导行并编辑值。保存过程很简单。但是我正在尝试确定如何实施取消过程。如果用户点击了一行并编辑了一个字段。
当我到达gc.cancel() 函数时,模型值已经更新,我所拥有的只是更改后的值。如何恢复原值?
【问题讨论】:
-
在指令中,您只能复制模型并在取消时恢复。如果您可以考虑将指令移动到组件(您应该这样做),您可以使用 $onChanges 挂钩的单向数据绑定
标签: javascript css angularjs