只有在该字段的焦点输出后才调用$ scope.watch函数

时间:2015-02-12 14:35:38

标签: javascript angularjs

我是角色的新手,我正在寻找一种调用函数的方法,目前只在焦点超出该字段后才会在每次更改后调用。这个函数的目的是检查用户是否更改了某个<td>中的数据,并且只有在他更改了数据函数时才应该执行。问题是现在每个按键调用该函数,所以如果使用在<td>中添加2个字符串,它将执行两次。

这是我的表:

<tbody ng-repeat="(user_id,script_id) in data">
    <tr ng-repeat="(script_id, cron_format) in script_id">
        <td class="userName">{{user(user_id)}}</td>
        <td class="scriptName">{{script(script_id)}}</td>
        <td class="cronFormat"><input type="text" ng-model="cron_format" ng-change="saveCron(user_id,script_id,cron_format)"/></td>
    </tr>
</tbody>

这就是功能:

$scope.$watch('cron_format',function(x,old){
    if(x!=old){
    }
});

$scope.saveCron = function(userId,scriptId,cronFormat){

   $.post("updateCronChange.php",
        "user_id="+userId+"&script_id="+scriptId+"&cron_format="+cronFormat, 
         function(data){
        //inside post
            alert('cron format changed to:'+cronFormat);
   });
}

任何有角度的方式我只能在焦点出来之后调用saveCron() field(cron_format)??

4 个答案:

答案 0 :(得分:6)

Angular 1.3.x的另一个解决方案是使用ngModelOptions指示仅在焦点事件上更新模型:

<input type="text" 
       ng-model="cron_format" 
       ng-change="saveCron()" 
       ng-model-options="{ updateOn: 'focusout', debounce: {'focusout': 0} }"/>

答案 1 :(得分:0)

答案 2 :(得分:0)

您可以在视图中使用ng-blur指令而不是ng-change。这样,每次输入字段失去焦点时都会调用saveCron。

答案 3 :(得分:0)

您不需要$watch(尽管可以),而是与另一个更改的值进行比较。您可以使用ng-blur来触发更改检查。

$scope.old = $scope.cron_format = "";

$scope.saveCron(user_id, script_id, cron_format) {
    if ($scope.old == $scope.cron_format) {
        return; //value was unchanged
    }
    $scope.old = $scope.cron_format;
    $http.post();
}); 
相关问题