Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs获取最近或当前更改的模型名称_Javascript_Angularjs - Fatal编程技术网

Javascript Angularjs获取最近或当前更改的模型名称

Javascript Angularjs获取最近或当前更改的模型名称,javascript,angularjs,Javascript,Angularjs,页面上可以有不同类型的输入元素。假设每个元素都绑定到一个模型。当任何输入元素的值发生更改时,是否有方法获取当前更改的或最近修改的模型名称?(“watch”可以使用,但随后需要添加每个要监视的元素。我想到了一种不为每个元素指定watch的方法:“一个公共列表器”)如果您的所有模型都位于同一对象下,您可以对该对象执行深度监视并构建历史记录 <input type="text" ng-model="user.name" /> <input type="text" ng-model="

页面上可以有不同类型的输入元素。假设每个元素都绑定到一个模型。当任何输入元素的值发生更改时,是否有方法获取当前更改的或最近修改的模型名称?(“watch”可以使用,但随后需要添加每个要监视的元素。我想到了一种不为每个元素指定watch的方法:“一个公共列表器”)

如果您的所有模型都位于同一对象下,您可以对该对象执行深度监视并构建历史记录

<input type="text" ng-model="user.name" />
<input type="text" ng-model="user.email" />
<input type="text" ng-model="user.details.phone" />
如果您使用的是Angular 1.3+

如果希望更好地控制模型更新的时间,可以查看ngModelOptions


此外,您还可以查看FormController和ngModelController上的$rollbackViewValue():$rollbackViewValue,$rollbackViewValue

然后,您可以使用$BROATCH或$emit,在任务的每个输入元素中使用scope.on捕捉它。@squiroid。谢谢你的回复。然后,需要广播或发射所有元素。。一个接一个。不是吗?我感觉更好的是,拥有一个公共侦听器并输出模型名称或任何有用的信息。.使用ng change发出或广播事件:-)您是否反对创建一个属性指令,您可以添加到要跟踪的输入中,并让它处理广播?谢谢。我的元素实际上包含在一个对象中。某些属性具有数组、数字和字符串。但是,您能告诉我如何获得型号名称吗??(例如,从您的示例中,如何检查更改的值是user.name还是user.email??)如果您想在每个型号的基础上执行某些操作,则您将无法使用全局监视,或者您需要更多的计算来确定newVal和oldVal之间的更改:类似于。但它开始增加更多的复杂性。。。
function Controller($scope) {
    $scope.user = {
        details: {}
    };

    var lastValue;

    // Deep watch ('true' as last argument)
    $scope.$watch('user', function (newVal, oldVal) {
       // Add to history (create a copy)
       lastValue = angular.copy(oldVal);
    }, true);
}