我为对话框编写了一个指令(myPopup),并为拖动该对话框编写了另一个指令(myDraggable),但是我总是收到错误消息:
多个指令[myPopup,myDraggable]要求新的/隔离的范围
这是一个柱塞:http ://plnkr.co/edit/kMQ0hK5RnVw5xOBdDq5P?p=preview
我能做什么?
JS代码:
var app = angular.module('myApp', []); function myController($scope) { $scope.isDraggable = true; } app.directive('myPopup', [ function () { "use strict"; return { restrict: 'E', replace: true, transclude: true, template: '<div my-draggable="draggable"class="dialog"><div class="title">{{title}}</div><div class="content" ng-transclude></div></div>', scope: { title: '@?dialogTitle', draggable: '@?isDraggable', width: '@?width', height: '@?height', }, controller: function ($scope) { // Some code }, link: function (scope, element, attr) { if (scope.width) { element.css('width', scope.width); } if (scope.height) { element.css('height', scope.height); } } }; } ]); app.directive('myDraggable', ['$document', function ($document) { return { restrict: 'A', replace: false, scope: { enabled: '=myDraggable' }, link: function (scope, elm, attrs) { var startX, startY, initialMouseX, initialMouseY; if (scope.enabled === true) { elm.bind('mousedown', function ($event) { startX = elm.prop('offsetLeft'); startY = elm.prop('offsetTop'); initialMouseX = $event.clientX; initialMouseY = $event.clientY; $document.bind('mousemove', mousemove); $document.bind('mouseup', mouseup); $event.preventDefault(); }); } function getMaxPos() { var computetStyle = getComputedStyle(elm[0], null); var tx, ty; var transformOrigin = computetStyle.transformOrigin || computetStyle.webkitTransformOrigin || computetStyle.MozTransformOrigin || computetStyle.msTransformOrigin || computetStyle.OTransformOrigin; tx = Math.ceil(parseFloat(transformOrigin)); ty = Math.ceil(parseFloat(transformOrigin.split(" ")[1])); return { max: { x: tx + window.innerWidth - elm.prop('offsetWidth'), y: ty + window.innerHeight - elm.prop('offsetHeight') }, min: { x: tx, y: ty } }; } function mousemove($event) { var x = startX + $event.clientX - initialMouseX; var y = startY + $event.clientY - initialMouseY; var limit = getMaxPos(); x = (x < limit.max.x) ? ((x > limit.min.x) ? x : limit.min.x) : limit.max.x; y = (y < limit.max.y) ? ((y > limit.min.y) ? y : limit.min.y) : limit.max.y; elm.css({ top: y + 'px', left: x + 'px' }); $event.preventDefault(); } function mouseup() { $document.unbind('mousemove', mousemove); $document.unbind('mouseup', mouseup); } } }; }]);
从文档:
应用于同一元素的多个不兼容指令的示例方案包括: 多个指令要求隔离范围 。 多个指令以相同的名称发布控制器。 使用transclusion选项声明的多个指令。 尝试定义模板或templateURL的多个指令。
应用于同一元素的多个不兼容指令的示例方案包括:
多个指令要求隔离范围 。
多个指令以相同的名称发布控制器。
使用transclusion选项声明的多个指令。
尝试定义模板或templateURL的多个指令。
尝试删除myDraggable指令上的隔离范围:
myDraggable
app.directive('myDraggable', ['$document', function ($document) { return { restrict: 'A', replace: false, scope: { enabled: '=myDraggable' }, //remove this line
替换scope.enabled为attrs.enabled:
scope.enabled
attrs.enabled
if (attrs.enabled == "true") {
并修改模板以绑定enable属性:
<div my-draggable="draggable" enabled="{{draggable}}"
演示