10

私はここにフィドルを持っています:http://jsfiddle.net/KdkKE/44/

私がやりたいのは、「トグル」コンポーネントを作成することです。基本的にはカスタムチェックボックスですが、コントローラーのブール値にバインドされているtrueまたはfalseの場合に変更されるhtmlを使用します。

ユーザーがトグルをクリックすると、モデルが更新され、ディレクティブのビューが変更されます。ディレクティブドキュメントhttp://docs.angularjs.org/guide/directiveの最後にある例と似ていますが、起動時に正しくなるように状態がバインドされます。

var app = angular.module('App', []);

function Ctrl($scope) {
    $scope.init = function() {
        $scope.foo = true
    }
}

 app.directive('toggle', function() {
        return {
            restrict: 'E',
            replace: true,
            transclude: true,
            scope: {
                label: '@',
                ngModel: '='
            },
            template: 
                '<div style="cursor: hand; cursor: pointer">{{label}}: {{ngModel}}</div>',
            link: function(scope, element, attrs, controller) {
                element.bind('click', function() {
                    scope.ngModel = false;
                    attrs.$set('ngModel', false);
                    console.log('plz', attrs.ngModel);
                });
            }
        };
    });

-

<div ng-app="App">
    <div ng-controller="Ctrl" ng-init="init()">
        <p>Foo in Ctrl: {{foo}}</p>  
        <toggle label="Foo" ng-model="foo"></toggle>
    </div>    
</div>
4

1 に答える 1

21

の使用を見逃しているだけだと思います$apply。ここで動作することを確認してください:http://jsfiddle.net/4TnkE/

element.bind('click', function() {
    scope.$apply(function() {
        scope.ngModel = !scope.ngModel;
    });
});

次のように使用して、別の関数でのネストを回避することもできます。

element.bind('click', function() {
    scope.ngModel = !scope.ngModel;
    scope.$apply();
});
于 2013-03-07T01:09:59.287 に答える