我有一个角度1.5(带组件)的应用程序。在其中一个组件中,我有一个本地对象定义为:
model.user = {
firstName: 'John',
lastName: 'Smith'
}
然后在标记中我将其用作:
<input class="field" ng-model="model.user.firstName" />
我想要做的是跟踪用户何时对此字段进行更改并记录事件。我花了一些时间查看不同的选项,但我想问一下使用组件时建议的方法是什么。这是我到目前为止所发现的:
我正在寻找像Telerik的kendo MVVM这样的方法。在那里,我可以将任何对象的change事件绑定到一个函数,并检索已更改的字段,旧值和新值。这种方法的优点在于,如果我的对象发生变化,我不必对我的代码进行任何更改,更改事件将获取新字段,而无需编写任何代码。更清洁,更易于维护。
这可能是角度1.5与组件?如果是这样,推荐的方法是什么?
谢谢。
答案 0 :(得分:1)
正如@CShark建议的那样,ng-change方法是最佳选择。为了减少标记中的冗长,我创建了一个自定义属性指令,它注入了ng-model-options和ng-change属性:
module.directive('inputChanged', function ($compile) {
function link(scope, element, attrs) {
var field = attrs.ngModel;
if (field) {
element.removeAttr('input-changed');
element.attr('ng-model-options', "{ updateOn: 'blur' }");
var fn = "model.changed('" + field + "', " + field + ", '{{ " + field + " }}')";
element.attr('ng-change', fn);
$compile(element)(scope);
}
}
return {
restrict: 'A',
link: link,
terminal: true,
priority: 1000
}
});
在我的模特中,我有:
model.changed = function (field, newValue, oldValue) {
//log the change
}
完成此操作后,只需将输入更改的属性添加到具有ng-model属性的任何元素。 E.g。
<input ng-model="model.user.firstName.value" input-changed />
请注意,我只是在用户通过设置ng-model-options提交更改后才捕获更改。另请注意,我将旧值和新值都传递给了model.changed函数。通过这种方式,我可以在不使用$ watch的情况下实现类似手表的功能。
我不确定这是否是最佳解决方案,但它会在我的方案中完成。