0

私はこの指令を持っています


MyApp.directive('dynatree', function ($rootScope) {
    return {
        restrict: 'E',
        link: function postlink(scope, element, attrs) {
            $(element).dynatree({
                onActivate: function (node) {
                    scope.$emit('nodeActivated', node);
                },
                persist: false,
                children: scope.treeData //this variable is in the layout for either csb or sku
            });
        }
    };
});


私のコントローラーには、子の値が含まれています。


scope.treeData = [ ... ]



scope.treeDataを更新するたびに、ディレクティブが更新されません。誰かが私のコントローラーから私のディレクティブを更新する方法について何か考えがありますか?

ありがとうございました

4

5 に答える 5

2

dynatree を使用したことはありませんが、src 配列が変更されたときにツリーが再描画されていないようです。

変更を監視しscope.tree.data、発生したらダイナツリーをリロードしてみてください。

MyApp.directive('dynatree', function ($rootScope) {
    return {
        restrict: 'E',
        link: function postlink(scope, element, attrs) {
            $(element).dynatree({
                onActivate: function (node) {
                    scope.$emit('nodeActivated', node);
                },
                persist: true,
                children: scope.tree.data //this variable is in the layout for either csb or sku
            });

            scope.$watch('tree.data', function() {
                // try to update the tree data here (I'm not aware how it's done)
                // and after that, reload...
                $(element).dynatree("getTree").reload();
            });
        }
    };
});

ツリー データを更新する方法がない場合は、ダイナツリーを破棄して再作成してみてください (ウォッチャー関数内で)。

// destroy tree
$(element).dynatree("destroy");    
// recreate tree with new data
$(element).dynatree({ ... children: scope.tree.data ... });

これは、この種の情報をスコープに直接保存するのではtree.dataなくtreeData、モデル内 (つまり ) に保存する必要があるためですscope.tree = { data: [ ... ] }

于 2013-02-16T00:46:31.470 に答える
1

scope。$watchを使用するのが、前に述べたように、進むべき道です。オブジェクトを見るとき、追加のパラメータとして「true」を使用する必要があることがわかりました

$watch("tree.data", function () {..}, true)

したがって、比較は怠惰になることはなく、参照だけよりも深くチェックします。

http://docs.angularjs.org/api/ng。$rootScope.Scope _

于 2013-02-16T07:59:48.697 に答える
1

Dynatree は、treeData を変更したことをどのように認識しますか? ディレクティブのツリーデータにウォッチャーをインストールして、おそらくそれを伝える必要があります。

scope.$watch('treeData', function(treeData, old, scope){
  element.dynatree().howEverDynatreeIsUpdated();
})

dynatree についてはわかりませんが、自分自身を更新することになっている場合、これはツリー内の変更に対してのみ機能することに注意してください。

ツリー全体をスコープ上の別のツリーに置き換える (= treeDatascopes プロパティを別のものに設定する) ことは、Dynatree によって検出されません。これは、作成中に Dynatree に渡されたツリーが、Dynatree が認識できる唯一のツリーであるためです。手動で干渉しない限りtreeData、スコープのプロパティが変更され、それ自体の参照が古いものを指していることを知ることはできません。なんとなく伝える必要があります。

于 2013-02-16T00:53:49.623 に答える
0

There are 2 ways to bind your variable inside AngularJs directive.First way is used,when you don't want to have isolated scope.You set watcher on attribute field.The second way is used,when you have isolated scope.this way is more professional.You set watcher only on your scope's variable. if you want more,here is a good article.

http://www.w3docs.com/snippets/angularjs/bind-variable-inside-angularjs-directive-isolated-scope.html

于 2015-07-23T22:02:00.883 に答える
0

わかりましたので、答えは


            scope.$watch('treeData', function (treeData, old, scope) {
                if (treeData.children) {
                    $(element).dynatree({children: treeData.children});
                    $(element).dynatree("getTree").reload();
                    $(element).show();
                }
            }, true)

ツリーのデータを変更するだけでは十分ではなく、リロードする必要があります...データの変更で跳ね返らないように、以前は非表示にしていたため、ショーを追加しました

于 2013-02-16T18:18:11.220 に答える