Javascript 加速编译函数

Javascript 加速编译函数,javascript,angularjs,angularjs-directive,angularjs-scope,frontend,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Frontend,我正在针对新范围手动编译模板: var scope = _.assign($rootScope.$new(true), { foo: 1, bar: 2 }) var element = angular.element('<my-element foo="foo" bar="bar"></my-element>') $compile(element)(scope) element.appendTo(container) var scope=..assign($r

我正在针对新范围手动编译模板:

var scope = _.assign($rootScope.$new(true), {
  foo: 1,
  bar: 2
})
var element = angular.element('<my-element foo="foo" bar="bar"></my-element>')
$compile(element)(scope)
element.appendTo(container)
var scope=..assign($rootScope.$new(true){
傅:1,,
酒吧:2间
})
变量元素=角度元素(“”)
$compile(元素)(范围)
元素.appendTo(容器)
运行基本配置文件后,此代码最慢的部分是
$compile
,每次编译大约需要1ms。当用户滚动时,我需要一次编译大约100个元素

在第一轮$compiles之后,我可以应用很多优化来加速编译,但我想加速第一轮100次编译。我还希望将模板保留在Angularland中,并避免注入原始HTML

怎么做

编辑:从下面复制并粘贴我的评论,以便将来看到此帖子的任何人都能看到:


好了,终于有道理了。如果将函数作为第二个参数传递给$link,angular将为您克隆节点。如果不这样做,它将在每次调用$link时重用相同的节点。无论哪种方式,都可以同步(作为$link的返回值)和异步(在回调中)访问返回的节点。这是一个设计糟糕的API,我在Angular的issue tracker中提交了一个问题-github.com/Angular/Angular.js/issues/11824

如果元素具有相同的结构,并且只是在链接范围上有所不同,然后,您应该
$compile
一次模板,然后
根据100个元素各自的作用域链接它们

var myElement = angular.element('<my-element foo="foo" bar="bar"></my-element>');
var myElementLinkFn = $compile(myElement);


// "items" here is the data that drives the creation of myElement elements
angular.forEach(items, function(item){
   var newScope = $scope.$new(true);

   newScope.foo = item.foo;
   newScope.bar = item.bar;

   myElementLinkFn(newScope, function(clone){
      container.append(clone);
   })
});
var myElement=angular.element(“”);
var myElementLinkFn=$compile(myElement);
//这里的“items”是驱动myElement元素创建的数据
角度。forEach(项目、功能(项目){
var newScope=$scope.$new(true);
newScope.foo=item.foo;
newScope.bar=item.bar;
myElementLinkFn(新闻镜,功能(克隆){
container.append(克隆);
})
});

您想像ng repeat那样编译100个元素或将其链接到作用域吗?就是这样!好建议!我遇到了另一个性能问题:由于克隆是异步返回的,因此将克隆附加到容器所需的时间是高度可变的。是否有同步API来获取克隆?@bcherny,
clone
返回syncronouslyah,这是真的。通过查看$compile代码,似乎一个$compile调用映射到一个元素——无法从一个调用生成多个元素。对一个元素的多个链接调用都将共享同一个元素。@b Herny,我认为您在这里混淆了一些东西。如果您传递了一个称为
cloneConnectFn
,则此函数将获得已编译节点的克隆。然后您可以使用类似于
element.append(clone)
的东西将其自由地附加到DOM中。该链接函数的结果是链接后的同一DOM元素克隆。所有这些都是同步发生的。如果您传递一个
cloneAttachFn
,那么它将生成一个克隆,否则,它将链接您编译的节点。这里有一个