如何强制重新编译具有隔离范围的指令?

时间:2015-01-02 14:52:59

标签: angularjs angularjs-directive angularjs-scope

当(模型)值发生变化时,有一些关于刷新指令的SO帖子:

推荐的方法是在链接功能中的scope 上观看值:

link: function(scope, element, attrs) {
    scope.$watch("typeId",function(newValue,oldValue) {
        // This gets called when data changes.
    });
 }

鉴于递归指令的以下实施,<my-directive>

angular.module('Myapp').directive("MyDirective", function(RecursionHelper) {
    return {
        restrict: "E",
        scope: {
            data: '=data'
        },
        templateUrl: 'view.html',
        compile: function(tElement, tAttributes) {
            return RecursionHelper.compile(tElement, tAttributes);
        }
    };
});

...和RecursionHelper:

angular.module('Myapp').factory('RecursionHelper',
    ['$compile',
    function($compile) {
         var RecursionHelper = {
            compile: function(tElement, tAttrs) {

                var contents = tElement.contents().remove();
                var compiledContents;

                return {
                    post: function(scope, iElement, iAttrs) {
                        if (!compiledContents) {
                            compiledContents = $compile(contents);
                        }

                        compiledContents(scope, function(clone) {
                            iElement.append(clone);
                        });
                    },
                    pre: function(scope, iElement, iAttrs) { }
                }
            }
        }
        return RecursionHelper;
    }]);

我可以将监听器添加到我的链接功能中:

angular.module('Myapp').factory('RecursionHelper',
    ['$compile','MyService',
    function($compile, MyService) {
         var RecursionHelper = {
            compile: function(tElement, tAttrs) {

                var contents = tElement.contents().remove();
                var compiledContents;

                return {
                    post: function(scope, iElement, iAttrs) {
                        if (!compiledContents) {
                            compiledContents = $compile(contents);
                        }

                        compiledContents(scope, function(clone) {
                            iElement.append(clone);
                        });

                        // The listener function.
                        scope.$watch(MyService.data,function(newValue,oldValue) {
                           // This gets called when data changes.
                        });
                    },
                    pre: function(scope, iElement, iAttrs) { }
                }
            }
        }
        return RecursionHelper;
    }]);

我添加了一个服务MyService,其中包含可能会更改的数据以及我正在侦听的数据。第一次呈现指令的调用是以main.html

开始的
<my-directive data="data"></my-directive>

调用指令的编译函数,最终呈现包含递归指令的模板view.html

<span ng-repeat="item in data.items">
      <my-directive data="item"></my-directive>
</span>

由于<my-directive> data属性具有隔离范围,因此每个嵌套指令都有自己的“沙盒”范围。

问题

  • 即使$watch被修改,我的MyService.data函数也不会被调用。这是因为该指令具有隔离范围吗?
  • 假设我的$watch函数被调用,触发重新编译的实际实现是什么? SO帖子只有console.log语句的注释,但我找不到任何关于再次呈现整个(root)指令的内容。

0 个答案:

没有答案