1

親コントローラーのスコープオブジェクトからのいくつかの変数を含む分離されたスコープで動作するディレクティブを取得するために、Angular docs に正確に従いました。

app.controller('MainCtrl', function($scope) {
    $scope.name = 'Parent Name';

    $scope.pokie = {
        whyIs: "thisUndefined?"
    };
});

app.directive('parseObject', function() {

    var preLink = function($scope, el, att, controller) {
        console.log('[link] :: ', $scope);
    };

    var postLink = function($scope, el, att, controller) {
        console.log('[PostLink] :: ', $scope);
        console.log('[$Parent] :: ', $scope.$parent.name);
    };

    return {

        restrict: 'E',
        scope: {
            myPokie: '=pokie',
            name: '=name'
        },
        template: [
          '<div>',
          '<h1>Directive does not get parent scope</h1>',
          '<h1>{{ myPokie }}</h1>',
          '<h2>{{ name }}</h2>',
          '</div>'
        ].join(''),

        compile: function() {
            return {
                pre: preLink,
                post: postLink
            }
        }
    }
});

http://plnkr.co/edit/FpQtt9?p=preview

私のコードの何が問題なのか誰か教えてもらえますか? ディレクティブの Isolate スコープが「myPokie」と「name」に対して未定義の値を返すのはなぜですか?

これには $scope.watch を使用する必要があると他の人が言っているのを見たことがあります..しかし、angularのディレクティブドキュメントはそれについて何も述べていません..そして、私は本当に些細なことに $scope.watch を使用したくありません箱から出してすぐに動作するはずです。

4

2 に答える 2

4

ディレクティブで分離スコープを宣言したので、属性を使用してそれらの値をディレクティブに提供することを意味します。

 scope: {
     myPokie: '=pokie',
     name: '=name'
 }

これは、ディレクティブ スコープが親スコープからプロトタイプとして継承されないことを意味します。pokie属性はディレクティブの値を提供し、myPokie属性はディレクティブnameの値を提供し、ディレクティブで値が変更された場合に双方向バインディングを示し、同じ参照値が親コントローラーで変更されます。属性についても同様です。name=myPokiename

ディレクティブ要素のマークアップは次のようにする必要があります。

<parse-object pokie="pokie" name="name"></parse-object>

働くプランカー

于 2015-05-05T20:02:59.800 に答える
1

分離スコープを使用していますが、変数を渡していません。問題は HTML にあります:

HTML を次のように変更します。

<parse-object></parse-object>

に:

<parse-object pokie="pokie" name="name"></parse-object>

分離スコープは、DOM 要素からパラメーターを取得します。したがって、スコープ宣言内にある場合:

myPokie: '=pokie',

つまり、スコープにある属性myPokieから変数を取得する必要があります。pokieまったく同じ名前なので、にname: "=name"変更できます。name: "="

プランカー

于 2015-05-05T20:03:05.927 に答える