2

问题是,我有一个简单的指令来从支持的(JSP 页面)获取数据(它有一个从角度调用函数来为 js 模型设置一些值,但是当我得到响应时调用函数是 x 次....

这是样本

http://plnkr.co/edit/OISkbF

当您看到控制台日志时,然后单击“加载表单 JSP”按钮,

首先是 3 次调用方法,接下来是 6 次......

这是 google grupe angularJS 中的主题 https://groups.google.com/d/msg/angular/18a_Iqkdbtk/eDuZ4OLfwJMJ

4

1 回答 1

2

我在你的例子中修复了一些东西,现在它只调用了两次函数(这实际上是正确的,因为这就是$digest的工作方式,它会调用绑定直到没有变化,所以每个至少 2 次。

你的 plunker 的工作叉:http ://plnkr.co/edit/Aw6S6T?p=preview

关键部分在这里:

app.directive('angularHtmlBind', function($compile, $http) {
return function(scope, elm, attrs) {
    var $elm = $(elm),
        url = 'search.jsp',
        html,
        currentScope;

    function getHTML(url) {
      $http.get('search.jsp').success(function(data) {
        html = data;
        currentScope = scope.$new();
        $elm.html(html);         
        $compile($elm.contents())(currentScope);       
        }).error(function(data, status, headers, config) {    
            console.log(data);
        }); 
    }        
    scope.$watch(attrs.shown, function(value) {                           
      if (value) {            
        getHTML(url);            
      } else if (currentScope) {            
        $elm.contents().remove();            
        currentScope.$destroy()            
      }          
    });
};
});

您的实施存在两个问题,您是:

  1. 调用$http并期待下面行中的结果,这是一个异步调用,所以我已将您的$compile移至成功处理程序
  2. 每次加载 jsp 文件时重用相同的范围,因此将相同的对象传递给新创建的控制器(每次$compile它都会创建控制器的新实例)。我正在为每个 jsp 文件创建一个新范围,然后在不再使用它时将其销毁。

当然,这个例子可以进一步改进,但我假设您多次加载示例文件只是为了说明问题;)如果没有,则调用它一次,然后使用存储内容的html var。

于 2012-11-29T17:10:37.997 回答