36

当我使用 jQuery 执行 DOM 操作(添加新 HTML)时,AngularJS 不会自动检测新 HTML 中的变量并用它们的值替换它们。例如:

$scope.showSummary = function($event){

    $($event.currentTarget).html("<div>{{row}}</div>");

};

这是一个简单的示例,但是在更改元素中的 HTML 之后(此函数由 调用ng-click),输出仍然是它{{row}}而不是上下文/范围中应该表示的行。

4

2 回答 2

66

您必须注入$compilehttp://docs.angularjs.org/api/ng.$compile)并使用它,以便 Angular 知道新的 html。

$compile('<div>{{row}}</div')($scope).appendTo($event.currentTarget);

然而,在控制器中进行 DOM 操作在角度上是不受欢迎的。您希望您的控制器处理业务,而您的视图处理视图。

尝试一个指令来做你想做的事。http://docs.angularjs.org/guide/directive

于 2012-07-28T11:51:20.093 回答
2

如果您对新元素使用片段(例如 $("<" + "div>").appendTo("body")),则对 JQuery prepend/append 方法使用如下包装器可以避免更改元素- 添加代码:

// run angular-compile command on new content
// (also works for prependTo/appendTo, since they use these methods internally)
var oldPrepend = $.fn.prepend;
$.fn.prepend = function()
{
    var isFragment = arguments[0][0] && arguments[0][0].parentNode && arguments[0][0].parentNode.nodeName == "#document-fragment";
    var result = oldPrepend.apply(this, arguments);
    if (isFragment)
        AngularCompile(arguments[0]);
    return result;
};
var oldAppend = $.fn.append;
$.fn.append = function()
{
    var isFragment = arguments[0][0] && arguments[0][0].parentNode && arguments[0][0].parentNode.nodeName == "#document-fragment";
    var result = oldAppend.apply(this, arguments);
    if (isFragment)
        AngularCompile(arguments[0]);
    return result;
};

function AngularCompile(root)
{
    var injector = angular.element($('[ng-app]')[0]).injector();
    var $compile = injector.get('$compile');
    var $rootScope = injector.get('$rootScope');
    var result = $compile(root)($rootScope);
    $rootScope.$digest();
    return result;
}
于 2014-10-18T17:22:11.300 回答