Angularjs - 如何绑定到javascript代码附加的html元素

1 html javascript jquery angularjs

我想将角度事件和模型绑定到javascript代码附加的html元素.

我的代码在这里.https://jsfiddle.net/hq7qk48n/13/

<div ng-app>
    <div ng-controller="MyController">
        <input type="text" ng-model="text1">
        <a href="#" ng-click="onClick()">click1</a>

        <div id="append"></div>
        <p ng-if="clickedTime1">click1 : {{ clickedTime1.toLocaleString() }}</p>
        <p ng-if="clickedTime2">click2 : {{ clickedTime2.toLocaleString() }}</p>
        <p>{{ text1 }}</p>
        <p>{{ text2 }}</p>
    </div>
</div>


function MyController($scope) {
    $scope.clickedTime1 = null;
    $scope.clickedTime2 = null;

    $scope.onClick = function () {
        var html = '<input type="text" ng-model="text2" name="text"> <a href="#" ng-click="onClick2()">click2</a>';
        $("#append").empty();
        $("#append").append(html);
        $scope.clickedTime1 = new Date();
    }

    $scope.onClick2 = function () {
        $scope.clickedTime2 = new Date();
    };
}
Run Code Online (Sandbox Code Playgroud)

onClick2()不起作用.并且模型"text2"未更新.如何绑定onClick2函数和text2模型?

需要编译一个html元素?怎么样?

小智 5

这有点棘手,因为你在新元素中有一个ng-click.我们需要处理两件事.

  1. 正确添加元素
  2. 让你的新元素看到范围

首先,我们将从您的元素调用方法开始.您需要在通话中添加$ event

    <a href="#" ng-click="onClick($event)">click1</a>
Run Code Online (Sandbox Code Playgroud)

$ event对象将为您提供有关调用元素的信息.

您还需要将其添加到您的方法中

    $scope.onClick=function($event){
Run Code Online (Sandbox Code Playgroud)

接下来,您的元素需要使用范围,因此我们需要将其转换为元素.否则只是html会好的.

    var el=angular.element('<input type="text" ng-model="text2" name="text"> <a href="#" ng-click="onClick2()"/>click2</a>');
Run Code Online (Sandbox Code Playgroud)

现在你可以使用一个小jquery,但确切地在目标元素上使用angular的方式.

    $($event.currentTarget).empty();
    $($event.currentTarget).append(el);
Run Code Online (Sandbox Code Playgroud)

此时您将看到您的更改,但绑定将无法工作,因为它未附加到范围,因此我们需要编译它.您需要将$ compile服务器添加到控制器

    function MyController($scope,$compile) {
Run Code Online (Sandbox Code Playgroud)

现在我们可以使用该服务来编译新元素

    $compile(el)($scope);
Run Code Online (Sandbox Code Playgroud)

你现在应该看到一切都按照你期望的方式运作

    function MyController($scope,$compile) {
$scope.clickedTime1 = null;
$scope.clickedTime2 = null;

$scope.onClick = function ($event) {
    var el = angular.element('<input type="text" ng-model="text2" name="text"> <a href="#" ng-click="onClick2()">click2</a>');
    $($event.currentTarget).empty();
    $($event.currentTarget).append(el);
    $compile(el)($scope);
    $scope.clickedTime1 = new Date();
}

$scope.onClick2 = function () {
    $scope.clickedTime2 = new Date();
};
Run Code Online (Sandbox Code Playgroud)

}

并且不要忘记将$ event添加到您的通话中.

我没有使用你的确切代码,但我测试了这个,因为我回答验证并且它工作得很好.在控制器中使用DOM元素可能不是最佳实践,但有时它只是起作用.你就是这样做的.