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.我们需要处理两件事.
首先,我们将从您的元素调用方法开始.您需要在通话中添加$ 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元素可能不是最佳实践,但有时它只是起作用.你就是这样做的.