【发布时间】:2019-12-15 10:32:48
【问题描述】:
我为 PDF 生成做了一个 json 文件设计器。
如果您想查看完整的代码,请打开底部的 plunker 链接。
视图的行为与预期不符。在调试器中,当我在其 SVG 场景中拖动元素时,模型会立即更改。 输入没有改变。 但是,如果我在输入框之间单击,它会突然将视图更新为正确的值。
这是我在指令内的作用域变量中设置值的地方:
function endDrag(evt) {
if (selectedElement) {
let selectedEntry = scope.data.templateData.find(function(entry) {
return entry.name === selectedElement.getAttribute("data-entry-name");
});
if(selectedEntry){
selectedEntry.x = parseInt(selectedElement.transform.baseVal.getItem(0).matrix.e / scope.data.pdfViwer.zoom);
selectedEntry.y = parseInt(selectedElement.transform.baseVal.getItem(0).matrix.f / scope.data.pdfViwer.zoom);
}
selectedElement = null;
}
}
这是我在控制器中的数据对象:
$scope.data = {
name: "",
type: [{name:'Text',value:'text'}, {name:'Image',value:'image'}, {name:'Line',value:'line'}],
templateData: [{
'type': {name:'Text',value:'text'},
'name': 'test',
'text': 'test3',
'x': 100,
'y': 100
}],
pdfViwer: {
height: 2970,
width: 2000,
zoom: .3
},
output: {
show:true
}
}
那些是更新太晚的输入字段:
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">(X,Y)</span>
</div>
<input type="text" ng-model="entry.x" aria-label="x" ng-init="entry.x=data.pdfViwer.width / 2" class="form-control">
<input type="text" ng-model="entry.y" aria-label="y" ng-init="entry.y=data.pdfViwer.height / 2" class="form-control">
</div>
这是预览 SVG 中 svg 组的组标记:
<g ng-repeat="entry in getTemplateData()" class="draggable" data-entry-name="{{entry.name}}"
transform="translate({{entry.x * data.pdfViwer.zoom}} {{entry.y * data.pdfViwer.zoom}})"
draggable="true">
它稍后更新输入字段的事实明显表明数据已正确传输到控制器。为什么右边的Form更新这么懒。 他们没有办法强制视图重新渲染吗?
非常感谢您提供的每一个有用的建议:/
【问题讨论】:
标签: javascript angularjs svg angularjs-directive ngdraggable