0

在编写属性指令时,我想将一个参数传递给该指令,这是一个可以写入的属性路径。(很像 ng-model 属性在输入上的工作方式。)如何设置指令以便我可以写入它?

示例:以AngularJS 网站上的 Draggable 指令为例。您只需在元素上声明属性即可使用它。

<span draggable>Drag ME</span>

我想创建一个如下所示的新指令:

<span draggable="somePath.someObj">Drag ME</span>

并且当在指令内部观察事物时(比如元素的位置),值将被写入位于范围上 somePath.someObj 的对象。

这是我开始的基本指令:

angular.module('drag', []).
  directive('draggable', function($document) {
    return function(scope, element, attr) {
      var startX = 0, startY = 0, x = 0, y = 0;
      element.css({
       position: 'relative',
       border: '1px solid red',
       backgroundColor: 'lightgrey',
       cursor: 'pointer'
      });
      element.on('mousedown', function(event) {
        // Prevent default dragging of selected content
        event.preventDefault();
        startX = event.screenX - x;
        startY = event.screenY - y;
        $document.on('mousemove', mousemove);
        $document.on('mouseup', mouseup);
      });

      function mousemove(event) {
        y = event.screenY - startY;
        x = event.screenX - startX;
        element.css({
          top: y + 'px',
          left:  x + 'px'
        });
      }

      function mouseup() {
        $document.unbind('mousemove', mousemove);
        $document.unbind('mouseup', mouseup);
      }
    }
  });

(Plunkr 在网站上找到。不确定实际链接是什么)

4

2 回答 2

0

您可以使用该$parse服务,请参阅此处的示例文档:http: //docs.angularjs.org/api/ng.$parse

于 2013-10-03T16:55:40.690 回答
0

我创建了一个有效的 CodePen 示例,演示如何在scope.$apply函数调用中使用$parse服务来执行此操作。

相关HTML:

<section class="text-center" ng-app="app" ng-controller="MainCtrl">
  <a href="#" my-directive="user.name">Hover me</a><br>
  Current value of 'user.name': {{user.name}}
</section>

相关代码:

var app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
  $scope.user = {
    name: 'value from controller'
  };
});

app.directive('myDirective', function($parse) {
  return {
    link: function(scope, element, attrs) {
      element.bind('mouseenter', function(event) {
        scope.$apply(function() {
          $parse(attrs.myDirective).assign(scope, 'value from directive');
        });
      });
    }
  };
});
于 2013-10-03T17:09:34.517 回答