2

contenteditablediv または要素のコンテンツの変更を監視できるようにするためにinput、次のディレクティブを作成しました。

app.directive('contenteditable',function() { return {
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
        // view -> model
        element.bind('input', function() {
            scope.$apply(function() {
                ctrl.$setViewValue(element["0"].tagName=="INPUT" ? element.val() : element.text());
                scope.watchCallback(element.attr('data-ng-model'));
            });
          });
        // model -> view
        ctrl.$render = function() {
            element.text(ctrl.$viewValue);
            element.val(ctrl.$viewValue);
        };
     }};
});

私のテストコントローラーは次のようになります。

function TestController($scope) {
    $scope.singleVal = "X";
    $scope.multiVal = ["A"];
    $scope.addRow = function() {
        $scope.multiVal.push("");
    };
    $scope.watchCallback = function(modelName) {
        console.log(modelName+" was changed");
    }; 
}

次の html に対してテストすると、singleVal (静的に作成) は正常に動作しますが、multiVal (ng-repeat を使用して動的に作成) は動作しません。値を入力すると、元の値が保持されます (つまり、モデルが更新されません)。助けてください。

<div data-ng-controller="TestController">
    <div contenteditable="true" data-ng-model="singleVal"></div>
    <button data-ng-click="addRow()">Add Row</button>
    <table data-ng-repeat="val in multiVal"><tr><td>
        <div contenteditable="true" data-ng-model="val"></div>
    </td></tr></table>
</div>
4

1 に答える 1