使用Directives注入DOM元素AngularJS

时间:2015-01-10 22:22:37

标签: javascript html angularjs

<ul>&#39;我有一个<li>

    <li ng-repeat="x in xs" ng-class-odd="'x'" ng-class-even="'y'">
    // inject here
        <span>
            {{x.v}}
        </span>
    </li>

我想在某个事件上注入一个上下文菜单(上面描述的DOM位置),如下所示:

        <ul id="context" class="col">
            <li class="three"><span>1</span></li>
            <li class="three"><span>2</span></li>
            <li class="three"><span>3</span></li>
        </ul>

实现此目的的最佳方法是什么?上面的1,2和3具有相同的功能来处理父容器中的重复列表项。所以我不确定如上所述注入上下文菜单是一个明智的想法,因为它会生成上下文菜单的非种子重复。

感谢。

1 个答案:

答案 0 :(得分:1)

这是一组contextmenu指令的一个非常基本的例子,其中菜单在主体中插入一次。

一个指令用于绑定contenxtmenu事件并将数据发送到控制菜单本身的指令。

选择的项目和鼠标位置作为广播

中的数据传递

HTML

  <ul>
    <li ng-repeat="item in items" context="item">{{item.title}}</li>
  </ul>

  <ul menu id="context" ng-show="menu_on">
    <li ng-click="itemAlert('id')">Alert ID</li>
    <li ng-click="itemAlert('title')">Alert Title</li>
  </ul>

JS

app.directive('context', function($rootScope) {
  return {
    restrict: 'A',
    scope: {
      item: '=context'
    },
    link: function(scope, elem) {
      elem.bind('contextmenu', function(evt) {
        evt.preventDefault();
        var data = {
          pos: { x: evt.clientX, y: evt.clientY},
          item: scope.item
        }
        scope.$apply(function(){
          $rootScope.$broadcast('menu', data);
        });

      });
    }
  }
})

 app.directive('menu', function($rootScope) {
  return {
    restrict: 'A',
    link: function(scope, elem) {
      scope.$on('menu', function(evt, data) {
        scope.menu_on = true;
        scope.item = data.item;
        var cssObj = {
          left: data.pos.x + 20 + 'px',
          top: data.pos.y - 40 + 'px'
        };
        elem.css(cssObj)
      });
      scope.itemAlert = function(prop) {
        scope.menu_on = false;
        alert(scope.item[prop])
      }
    }
  }
});

当用户在其外部点击时,需要一些其他文档侦听器来关闭菜单。这里的目的是创建能够显示菜单和传递数据的基本机制。

我还没看过,但可能已经有一些开源指令比这更先进了。

DEMO