将angularjs绑定到元素不起作用

时间:2014-05-24 09:43:45

标签: jquery html angularjs

我在服务器上已经生成了一些元素,我试图让angularjs在该元素上注册click事件,我该怎么做?

我的span元素是:

<span id="SpanIdHere" class="data-field"></span>

我为每个单击的字段都有一个jquery事件处理程序,因为我不知道哪种方式可以挂钩到click事件,因为服务器为我生成了这个html。

$("#report-html-content .data-field").click(function () {
    var id = $(this).attr("id");
   openFieldWithData(id);
});

这是我在角度控制器中的代码,它将打开模态覆盖。

function openFieldWithData(selection) {
    console.debug(selection);
    $scope.SelectedField.Name = selection
    $("#template-detail").addClass("open");
};

我想要做的是在UI中点击每个字段时显示模态叠加。

此代码完全有效,除非调用jquery click事件,只有当我关闭模式时,字段的名称才会出现在html中。

  <div id="template-detail" class="overlay-report">
    <div class="inner">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h6>
                    Template field
                    <button ng-click="closePanel()" data-id="btnCloseOverlay" type="button" class="close pull-right">×</button>
                </h6>
            </div>
            <div class="panel-body">
                {{SelectedField.Name}}
            </div>
        </div>
    </div>
</div>

1 个答案:

答案 0 :(得分:1)

附加事件处理程序中的代码生活在“Angular之外”,因此您需要手动告诉Angular触发摘要循环。否则,在其他东西触发之前,不会反映更改。

您可以使用$apply

  

$ apply()用于从外部执行角度表达式   角度框架。 (例如,来自浏览器DOM事件,   setTimeout,XHR或第三方库)。因为我们正在呼唤   我们需要执行适当范围生命周期的角度框架   异常处理,执行手表。

如果仅从Angular外部调用openFieldWithData,您可以:

function openFieldWithData(selection) {
  $scope.$apply(function() {
    $scope.SelectedField.Name = selection
    $("#template-detail").addClass("open");
  });
}

否则你需要把它放在事件处理程序中:

$(".data-field").click(function() {

  var element = $(this);
  var scope = element.scope();

  scope.$apply(function() {
    openFieldWithData(element.attr("id"));
  });
});