angular.js - Angular控制器和指令的交互
淡淡烟草味
淡淡烟草味 2017-05-15 16:53:35
0
6
721

HTML部分

<index></index>

指令

angular.module('todoWithAngularApp').directive('index', function () {
    return {
        restrict: 'E',
        templateUrl: '/scripts/template/index.html',
        replace: true,
        link: function (scope, iElement, iAttrs) {
            console.log(scope);
            console.log(iElement);
            console.log(iAttrs);

            iElement.on('click', '#addTaskClass', function(event) {
                scope.addTaskClassBoxDisplay = true;
                console.log(scope.addTaskClassBoxDisplay);

            })
        }
    };

控制器

angular.module('todoWithAngularApp').controller('IndexCtrl', function ($scope) {
    $scope.addTaskClassBoxDisplay = false;
});

怎样才能让指令去修改控制器上的$scope的属性

淡淡烟草味
淡淡烟草味

全員に返信(6)
阿神

無責任かつ未検証ですが、いくつかのアイデアを紹介します:
1. addTaskClassBoxDisplay をオブジェクトの下に配置します (例:
) scope.obj.addTaskClassBoxDisplay = true
2. メッセージを使用する
3.サービスを利用する

上記の 3 つの方法は、Angular のモジュール間でデータを共有する一般的な方法でもあり、さまざまなシナリオに適応できます。

いいねを押す +0
曾经蜡笔没有小新

http://stackoverflow.com/questions/14115701/angularjs-create-a-directi...


リーリー
いいねを押す +0
为情所困

まず独立したスコープを開き、「=」を使用してスコープのオブジェクトに対して双方向バインディングを実行します。以下の例のように、コマンドのobjがバインドされてaddTaskClassBoxDisplayオブジェクトに送信されます

リーリー
いいねを押す +0
伊谢尔伦

この質問をする前に、質問を修正させてください。
コントローラーの $scope を変更したいとします。まず、自分で定義した命令はコントローラー内のスコープです。別のスコープを継承したり作成したりしません。したがって、命令のスコープ内の属性を変更すると、この命令を参照するコントローラーのスコープの対応する属性も確実に変更されることになります。
コントローラを作成したときに、なぜコントローラのスコープを変更しなかったのかと疑問に思われるかもしれません。
理由は
を使用したからです iElement.on('click', '#addTaskClass', function(event) {
scope.addTaskClassBoxDisplay = true;
自分で定義したクリック リスナーは、scope 属性の変更をトリガーしますが、Angular にダーティ チェックを実行するように通知することはありません。つまり、addTaskClassBoxDisplay を変更すると、ページ上で応答しなくなります。
このエラーを修正する方法。 $apply() を追加するだけです。ダーティ チェックを手動でトリガーします。使用方法は自分で百度に問い合わせてください。
さて、あなたの質問に戻りましょう。ディレクティブでコントローラーのスコープを変更する方法。
1. ディレクティブの内部属性から始めましょう。
ディレクティブのscope属性とその3つのメソッドは、コントローラーのスコープを変更できます。
1.スコープが定義されていないか、スコープ: false。コントローラーのスコープを直接使用します
2. スコープ: true。コントローラーを継承するスコープです。現時点では、変更するコンテンツはオブジェクトとして定義するのが最適です。
3. スコープ: {key:'=key'}。独立したスコープです。変更方法は上記と同じですが、オブジェクトとして定義するのがベストです
それから別の人に言います。 iAttrs を使用して、ディレクティブの属性として定義します。
var model = $parse(iAttrs.addTaskClassBoxDisplay);
iElement.on('click', '#addTaskClass', function(event) {
model.assign(scope,true);
スコープ.$apply();
2. ラジオを使用します。具体的には百度。
3. サービスを利用して配達します。
4. この命令は $rootScope を呼び出し、コントローラーのスコープ属性を $rootScope 属性と等しくします。 (これはやめてください)
もう仕事に行く時間なので、後で Baidu を使用できます。

いいねを押す +0
世界只因有你

http://www.hubwiz.com/course/54f3ba65e564e50cfccbad4b/
基本: http://www.hubwiz.com/course/547c3e3b88dba0087c55b4e5/

いいねを押す +0
漂亮男人

とても良い質問です、私も聞きたいです

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート