7

私は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();
                }
            });
        }
    };
});

これがフィドルです:

http://jsfiddle.net/5Mzda/19/

コードの何が問題なのかわかりません。助けていただければ幸いです!

アップデート

元の質問のコメントをもっと詳しく読んだところ、$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();
                }
            });
        }
    };
});

これを行うためのよりエレガントな方法があるかどうかはわかりませんが、バインディングは現在正しく機能しているようです。

4

1 に答える 1

7

これは問題ないようです。

angular フレームワークですべての角度関連の式を実行する必要があります。イベント ハンドラーの外部から呼び出される dom イベント ハンドラーとメソッドの場合、 $apply を使用して角度でそれらを実行する必要があります

行う必要がある唯一の変更は、ステートメントを内部に移動することです$apply()

scope.$apply(function(){
    scope.$eval(attrs.xpos + '=' + ui.position.left);
    scope.$eval(attrs.ypos + '=' + ui.position.top);
});

デモ:フィドル

于 2013-03-18T07:32:08.383 に答える