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并在发生时重新加载 dynatree:

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();
            });
        }
    };
});

如果无法更新树数据,请尝试销毁 dynatree 并重新创建它(在 watcher 函数中):

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

请注意,我使用了tree.dataand not treeData,这是因为您不应将此类信息直接存储在示波器上,而应将其存储在模型中(即scope.tree = { data: [ ... ] })。

于 2013-02-16T00:46:31.470 回答
1

Dynatree 如何知道您更改了 treeData?您可能需要通过在指令中的 treedata 上安装观察程序来告诉它:

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

我不知道 dynatree,但如果它应该自我更新,请注意这仅适用于树内的修改。

treeDataDynatree 不会检测到用范围上的另一棵树替换整个树(= 将 scopes属性设置为其他内容),因为您在创建期间传递给 Dynatree 的树是 Dynatree 唯一可以知道的。在没有人工干预的情况下,它无法知道treeData范围上的属性已更改,并且它自己的引用指向一个过时的引用。你需要以某种方式告诉它。

于 2013-02-16T00:53:49.623 回答
1

使用 scope.$watch 是要走的路——正如前面提到的那些人。在观看对象时,我发现有必要使用“true”作为附加参数

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

所以比较不会懒惰,并且会比参考更深入地检查。

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

于 2013-02-16T07:59:48.697 回答
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 回答
0

有两种方法可以在 AngularJs 指令中绑定你的变量。当你不想有孤立的范围时,使用第一种方法。您在属性字段上设置观察者。使用第二种方式,当您有隔离范围时。这种方式更专业。您仅在范围的变量上设置观察者。如果你想要更多,这里有一篇好文章。

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

于 2015-07-23T22:02:00.883 回答