在请求范围的服务中使用 $compile

Using $compile in services asking for scope

我可以在服务中使用 $compile 吗,因为它抛出错误范围不存在。

services.factory('getRegistersrvs', function($http, $compile) {

 return {
     getRegisterpage: function() {
         return $http.get(baseUrl+'signup', {cache: true});
     },
     replaceTemp: function(response, $elem) {
         $elem.replaceWith($compile(response.data));
     }
 }
});

这里response.data是从ajaxhttp.get.

得到的html数据

我需要使用它来让动态元素的 ng click 工作

$compile 服务总是需要一个范围来编译给定的内容。它基本上在给定范围的上下文中执行 HTML 中的每个 angular 表达式和代码。

因此您需要提供一些范围才能使其像 $rootScope 一样工作。

services.factory('getRegistersrvs', function($http, $rootScope, $compile) {

 return {
     getRegisterpage: function() {
         return $http.get(baseUrl+'signup', {cache: true});
     },
     replaceTemp: function(response, $elem) {
         $elem.replaceWith($compile(response.data)($rootScope));
     }
 }
});

您可以使用 scope 方法访问元素范围:

replaceTemp: function(response, $elem) {
    var scope = $elem.scope();
    $elem.replaceWith($compile(response.data)(scope));
}

此方法假定 $elemangular.element 的实例。如果不是(例如纯 DOM 元素),则需要将其包装 angular.element($elem).scope().

另一种方法是使用 $rootScope.$new() 创建新范围或简单地使用 $rootScope 本身,当然使用被替换元素的范围是有意义的。