如何在角度js中自定义$ watch?

时间:2015-09-09 15:11:40

标签: javascript angularjs

我想要一个自定义$watch。我会在变量上制作这款手表。我希望当变量的值被更改为查看消息时,以及当变量未更改其值以查看另一条消息时。

一个例子是下一个:我有一个文本框,我在用户写东西时观察。我希望在他写东西时看到一条消息,并在停下来看另一条消息。

2 个答案:

答案 0 :(得分:0)

您可以查看超时:

[HttpPost]
public ActionResult Index(Models.customer cs )
{

        if(isValid(cs.email, cs.password))
        {
            Session["user"] = cs.email;
            FormsAuthentication.SetAuthCookie(cs.email, false);

            customer c = customerEntity.customers.Single(e => e.email == cs.email);
            return MemberInfo(c);
        }
        ModelState.AddModelError(string.Empty, "Authentication Failed");
        return View(cs);
}

答案 1 :(得分:0)

我建议的概念在许多javascript库中称为debounce。你给一个函数来调用和一个必须通过的时间长度,而不会在触发回调之前再次调用该函数。通常,您也可以提供在初始调用时触发回调的选项。这将允许您在第一次调用时翻转开关,然后在没有再次调用该函数的情况下经过一段时间后将其翻转。

请参阅:http://davidwalsh.name/javascript-debounce-function

前:

(更好的示例是使用debounce创建$timeout服务,无需$scope.$evalAsync()

app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  var toggle = debounce(function() {
    $scope.typing = !$scope.typing;
    $scope.$evalAsync();
  }, 500, true)

  $scope.$watch('name', toggle)
});

function debounce(func, wait, immediate) {
  var timeout;
  return function() {
    var context = this;
    var args    = arguments;
    var callNow = immediate && !timeout;

    clearTimeout(timeout);
    timeout = setTimeout(later, wait);

    if (callNow){
      func.apply(context, args);
    }

    function later() {
      timeout = null;
      func.apply(context, args);
    }
  };
}