【问题标题】:How to observe custom events in AngularJS?如何在 AngularJS 中观察自定义事件?
【发布时间】:2013-02-17 20:30:12
【问题描述】:

简单示例:我有一个 textarea 并想为其提供额外的行为:在 enter 键上执行某些操作并转到 shift + enter 上的下一行

我想我应该提供额外的指令来添加该行为。我已经这样做了:http://jsbin.com/oruvuy/1/edit

附:一件骇人听闻的事情对我来说似乎很奇怪:我手动调用$digest()。可以吗?有什么想法吗?

JS:

angular.module('Chat', [])
  .directive('enterSubmit', function () {
    return {
      restrict: 'A',
      link: function (scope, element, attrs) {
        var submit;

        $(element).on({
          keydown: function (e) {
            submit = false;

            if (e.which === 13 && !e.shiftKey) {
              submit = true;
              e.preventDefault();
            }
          },

          keyup: function () {
            if (submit) {
              scope.$eval( attrs.enterSubmit );

              // flush model changes manually
              scope.$digest();
            }
          }
        });
      }
    };
  });

function ChatCtrl($scope) {
  $scope.messages = [{
    text: 'Sample Message',
    datetime: new Date()
  }];

  $scope.add = function () {
    $scope.messages.push({
      text: $scope.message,
      datetime: new Date()
    });
    $scope.message = '';
  };

  $scope.message = '';
}
<body ng-controller="ChatCtrl">

  <h1>Leave message:</h1>
  <form>
    <div class='hint'>Click &lt;Enter&gt; to submit :)</div>
    <textarea
      cols="30"
      rows="5"
      ng-model="message"
      enter-submit='add()'
    ></textarea>
    <br />
    <button type="submit" ng-click="add()">Send message!</button>
  </form>

  <h3>Messages list:</h3>
  <table>
    <tr>
      <th>Text</th>
      <th>Date</th>
    </tr>
    <tr ng-repeat="message in messages">
      <td class='text'>{{message.text}}</td>
      <td class='date'>{{message.datetime | date:"HH:mm:ss"}}</td>
    </tr>
  </table>

</body>

但是这样做是正确的方法吗?

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    是的,指令链接函数中的绑定事件正是您想要做的。

    调用 $digest 并不难——您示例中的消息被添加到 keyup 上的模型中,并且 Angular 不会消化这些更改,直到有东西告诉它。它实际上会在下一个 keydown 时被消化,但由于您需要在 keyup 之后发生 $digest,因此您必须手动调用它。

    【讨论】:

    • 太好了,感谢您的解释。但我一直不了解事件。 AngularJS 正在监听页面上的所有事件,然后检查每个对象的状态?有什么可以理解的文章吗?我在 AngularJS 上读过这方面的内容,但很难快速理解。
    • 我推荐this StackOverflow question 作为一个很好的参考。
    猜你喜欢
    • 2014-12-12
    • 2017-08-23
    • 2017-05-01
    • 2012-12-08
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多