簡體   English   中英

ng-change事件不起作用

[英]ng-change event not working

我已經使用Angular JS創建了一個自定義指令。 我在控制器內部有一個函數,試圖從文本框中調用ng-change事件。 但是沒有調用該函數。 這是我的代碼:

<script>
    var delightMeterApp = angular.module('delightMeterApp', []);
    delightMeterApp.directive('delightMeter', function () {
        return {
            scope: true,
            restrict: 'E',
            template: '<div id="delightmeter"></div>',
            link: function (scope, element) {


                newdiv = jQuery('<div/>', {
                    id: 'delightContainer',
                    class: 'singlenote'
                }).appendTo('#delightmeter');

                var appendstring = "";
                appendstring += "<svg width='500px' height='300px' version='1.1' xmlns='http://www.w3.org/2000/svg>'";
                appendstring += "<g>";
                appendstring += "<text x='100' y='220' fill='black'>0</text>";
                appendstring += "<text x='300' y='220' fill='black'>100</text>";
                appendstring += "<path class='arc' id='arc1' d='' />";
                appendstring += "<path class='arc' id='arc2' d='' />";
                appendstring += "<path class='arc' id='arc3' d='' />";
                appendstring += "<path class='arc' id='arc4' d='' />";
                appendstring += "<path class='arc' id='arc5' d='' />";
                appendstring += "<g class='needleset'>";
                appendstring += "<circle class='needle-center' cx='200' cy='200' r='5'></circle>";
                appendstring += "<path class='needle' d='M 195 198 L 200 100 L 205 202'></path>";
                appendstring += "</g></g></svg>";

                newdiv.append(appendstring);

                document.getElementById("arc1").setAttribute("d", describeArc(200, 200, 100, -90, -56));
                document.getElementById("arc2").setAttribute("d", describeArc(200, 200, 100, -54, -20));
                document.getElementById("arc3").setAttribute("d", describeArc(200, 200, 100, -18, 16));
                document.getElementById("arc4").setAttribute("d", describeArc(200, 200, 100, 18, 52));
                document.getElementById("arc5").setAttribute("d", describeArc(200, 200, 100, 54, 90));

                function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
                    var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;

                    return {
                        x: centerX + (radius * Math.cos(angleInRadians)),
                        y: centerY + (radius * Math.sin(angleInRadians))
                    };
                }

                function describeArc(x, y, radius, startAngle, endAngle) {

                    var start = polarToCartesian(x, y, radius, endAngle);
                    var end = polarToCartesian(x, y, radius, startAngle);

                    var arcSweep = endAngle - startAngle <= 180 ? "0" : "1";

                    var d = [
                        "M", start.x, start.y,
                        "A", radius, radius, 0, arcSweep, 0, end.x, end.y
                    ].join(" ");

                    return d;
                }
            },
            template: '<div id="delightmeter"></div>',
            controller: "delightMeterController"

        };
    });
    delightMeterApp.controller('delightMeterController', function ($scope) {

        $scope.fun = function () {
            alert("called");
        }
    });
</script>

以下是我的HTML

<div ng-app="delightMeterApp" ng-controller="delightMeterController">
    <delight-meter ng-model="delightScore"></delight-meter>
    <input id="Text1" type="text" ng-change="fun()" />
</div>

將相同的控制器用於自定義指令和輸入控件是否正確? 我在這里做錯了什么?

Sooraj,

就像NexusDuck所說的那樣,您永遠不要在控制器中操縱DOM。 我已經對您的代碼進行了重新組織,以在指令中進行DOM操作,而Controller僅調用Rotate Needle函數。 旋轉針功能確實在指令中被調用。

這是HTML

<div ng-controller="delightMeterController">
<delightmeter delight-meter-reference='delightMeterReference'></delightmeter>
<input id="txtScore" type="text" ng-model="delightScore" ng-change="delightMeterReference.RotateNeedle(delightScore)" />{{delightScore}}
</div>

這是您的指令:

.directive('delightmeter', function () {
    function link($scope, $element, $attrs) {

        var meter = $element[0];
        console.log(meter);

        document.getElementById("arc1").setAttribute("d", describeArc(200, 200, 100, -90, -56));
        document.getElementById("arc2").setAttribute("d", describeArc(200, 200, 100, -54, -20));
        document.getElementById("arc3").setAttribute("d", describeArc(200, 200, 100, -18, 16));
        document.getElementById("arc4").setAttribute("d", describeArc(200, 200, 100, 18, 52));
        document.getElementById("arc5").setAttribute("d", describeArc(200, 200, 100, 54, 90));

        function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
            var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;

            return {
                x: centerX + (radius * Math.cos(angleInRadians)),
                y: centerY + (radius * Math.sin(angleInRadians))
            };
        }

        function describeArc(x, y, radius, startAngle, endAngle) {

            var start = polarToCartesian(x, y, radius, endAngle);
            var end = polarToCartesian(x, y, radius, startAngle);
            var arcSweep = endAngle - startAngle <= 180 ? "0" : "1";
            var d = [
                "M", start.x, start.y,
                "A", radius, radius, 0, arcSweep, 0, end.x, end.y
            ].join(" ");
            return d;
        }

        function RotateNeedle(delightScore) {
            console.log(delightScore);
            $('.needleset').css({
                "transform": "rotate(" + delightScore + "deg)",
                "transform-origin": "50% 95%"
            });
        }

        if ($scope.delightMeterReference) {
            $scope.delightMeterReference.RotateNeedle = function (delightScore) {
                RotateNeedle(delightScore);
            }
        }
    }
    return {
        restrict: 'E',
        templateUrl: 'components/comp01/comp01.html',
        scope: {
            delightMeterReference: '='
        },
        link: link
    };
})

這是您的控制器

.controller('delightMeterController', function ($scope) {

    $scope.delightScore = 0;
    $scope.delightMeterReference = {};


})

謝謝你,希瓦斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM