javascript - 当用户更新输入时,如何让 AngularJS 1.6 一次调用一个函数
问题描述
我编写了一些 AngularJS 代码,允许用户在浏览器的某些输入中输入一些数字,然后查看在svg
元素上绘制的线条作为响应。
该svg
元素有许多子line
元素。每个都有属性 x1、x2、y1、y2 和样式。这些属性中的每一个都有一个计算值。每个计算值都是从 Javascript 函数返回的对象的属性。这意味着 Javascript 函数被调用五次:每行的每个属性调用一次。
为了整理我的显示代码并提高性能,我编写了一个 Javascript 函数,它返回一个对象数组,每个对象包含属性 x1、x2、y1、y2 和单个线条元素的样式的值。我认为这是一个简单合理的解决方案。
我的代码现在看起来像这样:
<line ng-repeat="line in getLines()" x1="{{line.x1}}" x2="{{line.x2}}
y1="{{line.y1}}" y2="{{line.y2}}" ng-style="line.style" />
当我运行这段代码时,我得到一个 AngularJS infdig 错误,表明该模型将被计算无数次。我检查了这个错误的文档: https ://docs.angularjs.org/error/$rootScope/infdig
它说:一个常见的错误是绑定到一个函数,该函数每次调用它都会生成一个新数组……解决方案是如果元素没有更改,则返回相同的数组对象。
最后一部分根本没有帮助,因为该数组的内容确实会随着输入到表单中的每个数字而改变。
我觉得我正在做一些事情来使这比应该做的更难。
我想要的是当用户在输入字段中修改一个或多个数字时,该函数getLines
应该被调用一次,结果应该用于填充各种line
元素的属性,以便用户可以在浏览器中看到行。
如何确保getLines
在更新 inptu 字段时调用一次?
解决方案
我会做的是:
输入:
<input id="x1" type="text" ng-change="changeHandler(elem)"/>
.
.
<input id="y2" type="text" ng-change="changeHandler(elem)"/>
处理程序:
function changeHandler(elem) {
//Get value from event
if (elem.id = 'x1')
if (line.x1 != elem.value) {
//Call function to update svg
applyChange(line)
}
//.
//.
//.
else if (elem.id = 'y2')
if (line.y2 != elem.value) {
applyChange(line)
}
}
推荐阅读
- c# - 创建团队时如何为该团队创建新日志?
- marklogic-corb - MarkLogic CORB - 运行 corb 的权限是什么
- python - Select columns in a DataFrame conditional on row
- css - 什么是创建具有动态行的反应网格的方法
- machine-learning - 支持向量分类器中的平面分离和决策边界有什么区别?
- flutter - 通过 addPostFrameCallback 访问 Flutter Provider 时说小部件在小部件树之外,但颤振检查器显示其他情况
- python - 在一列中查找重复项并返回两个重复项的索引
- python - 'NoneType' 对象在 tkinter 上没有属性 'get' 错误
- javascript - 显示命令的剩余时间
- python - 执行熊猫查询时的SettingWithCopyWarning