私はデータのテーブルを持っています:
<table class="table table-hover" ng-class="dndElemClass" drag-and-drop>
...
</table>
$scope.dndElemClass = 'on-drag-enter'
私の目標は、要素のondragenter
イベント リスナーに割り当てることによって、テーブルにドロップ シャドウを与えることです。
.on-drag-enter {
-webkit-box-shadow: -3px 3px 5px 3px #ccc;
...
}
ディレクティブは次のonDragEnter
とおりです。
directive('dragAndDrop', function() {
return {
restrict: 'A',
controller: function($scope) {
$scope.dndElemClass = '';
},
link: function($scope, elem, attr) {
$scope.$watch('currentFolder.canUpload', function(newValue, oldValue) {
if (newValue && Modernizr.draganddrop && window.File) {
elem[0].ondragenter = function(evt) {
evt.stopPropagation();
evt.preventDefault();
$scope.$apply(function() {
$scope.dndElemClass = 'on-drag-enter';
});
};
elem[0].ondragleave = function(evt) {
evt.stopPropagation();
evt.preventDefault();
$scope.$apply(function() {
$scope.dndElemClass = '';
});
};
elem[0].ondrop = function(evt) {
...
};
}
});
}
}
})
およびイベント リスナーで$scope.dndElemClass
の値を割り当てたにもかかわらず、 は値を認識せず、ドロップ シャドウが表示されないためクラスを割り当てていないようです。ondragenter
ondragleave
<table>
これまでのところ、上記のコードで空白に割り当てられているディレクティブのコントローラー プロパティにクラスを設定すると値が認識されることをテストしたので、ディレクティブからそれを受け入れることがわかっています。テストとしてコントローラーに設定されたクラスで、ondragenter
リスナーをトリガーすると、クラスが削除されます。$scope.$apply()
がロギングでの値を適切に割り当てていることも確認しましたscope.dndElemClass
が、何らかの理由で、イベント リスナーの に設定する$scope.$apply()
と、テーブルのng-class
属性が変数の割り当てを認識せず、空であると見なされます。
更新:$apply
Josh のコメントに従って、イベント リスナーのコールバックで変数を割り当てる
必要がないように、コードをクリーンアップしました。
directive('dragAndDrop', function() {
return {
restrict: 'A',
controller: function($scope) {
$scope.dndElemClass = '';
},
link: function($scope, elem, attr) {
$scope.$watch('currentFolder.canUpload', function(newValue, oldValue) {
if (newValue && Modernizr.draganddrop && window.File) {
elem.bind('dragenter', function(evt) {
evt.stopPropagation();
evt.preventDefault();
$scope.dndElemClass = 'on-drag-enter';
});
elem.bind('dragleave', function(evt) {
evt.stopPropagation();
evt.preventDefault();
$scope.dndElemClass = '';
});
elem.bind('drop', function(evt) {
//...
});
}
});
}
}
})
まだ運がありません。ロギングを使用してコールバックを実行していることを確認できますが、変数の割り当てがテーブルのng-class
属性によって認識されることはありません。
更新 2: ngClass に関する AngularJS のドキュメントを 読んだ後、私はさらに混乱しています。私にとっては、現在のコントローラー(または私の場合はディレクティブ)の変数に必要なクラスの名前(配列内の名前)を設定するのと同じくらい簡単だと思いました$scope
。次に、どこでもそうするようにその変数の名前を指定します要素のng-class=""
属性のelse。しかし、私が読んでいるように、人々が式を使用したり、クラス名を切り替えたりしているため、より複雑なようです。
トグルのアイデアを使用して、プランカーをフォークして、ユーザーがトリガーするか$scope.dndElemClass
どうかに基づいて、状況設定をブール値に再作成しました。また、 overまたはの利点を理解していないことがわかったので、適切な測定のために含めました。いずれにせよ、これによってテーブルのクラスが期待どおりに設定されることはありませんでした。dragenter
dragleave
$scope.$apply()
angular.bind()
.addEventListener
.ondragenter = function() {};