私はAngularを初めて使用し、ユーザーがドラッグした後、要素上の位置をモデルにバインドするディレクティブを作成しようとしています。単純なオブジェクトでこれを解決する別のStackOverflowの質問を見つけました。
ドラッグ後の左右の位置のAngularjsディレクティブ属性バインディング
myApp.directive('draggable', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.draggable({
cursor: "move",
stop: function (event, ui) {
scope[attrs.xpos] = ui.position.left;
scope[attrs.ypos] = ui.position.top;
scope.$apply();
}
});
}
};
});
ここでフィドルソリューションを参照してください:http://jsfiddle.net/mrajcok/5Mzda/
今、私はこれをより複雑なオブジェクトとで動作させようとしていますng-repeat
が、なぜ動作しないのか理解できないようです。
これが私のHTMLです:
<div ng-controller="MyCtrl">
<div ng-repeat="position in positions">
<input type="number" ng-model="position.divleft"/>
<input type="number" ng-model="position.divtop"/>
<p draggable class="example" ng-style="{left: position.divleft, top: position.divtop}" xpos="position.divleft" ypos="position.divtop">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
そしてここにJSがあります:
var myApp = angular.module('myApp', []);
function MyCtrl($scope) {
$scope.positions = [
{"divtop": 80,
"divleft": 200
},
{"divtop": 100,
"divleft": 250
}
];
};
myApp.directive('draggable', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.draggable({
cursor: "move",
stop: function (event, ui) {
scope[attrs.xpos] = ui.position.left;
scope[attrs.ypos] = ui.position.top;
scope.$apply();
}
});
}
};
});
これがフィドルです:
コードの何が問題なのかわかりません。助けていただければ幸いです!
アップデート
元の質問のコメントをもっと詳しく読んだところ、$eval
作品を使用しているように見えます。
myApp.directive('draggable', function () {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.draggable({
cursor: "move",
stop: function (event, ui) {
scope.$eval(attrs.xpos + '=' + ui.position.left);
scope.$eval(attrs.ypos + '=' + ui.position.top);
scope.$apply();
}
});
}
};
});
これを行うためのよりエレガントな方法があるかどうかはわかりませんが、バインディングは現在正しく機能しているようです。