我正在使用AngularJS中的无限滚动UI构建复杂的可变布局。
想想像Flipboard这样的重载数据项,每个项目包含相同的东西(标题,描述,图像等)。每个项目都预先加载到JSON中,进行排序,然后组织成一系列页面,从一系列变量布局中选择。每个页面都有一个可变数字列,每列有一个可变数量的行。
为了实现这一点,我在每个页面布局中使用多个指令,在运行时编译。在每个布局指令中,我然后构建一个可变数量的列,每个列包含可变行数的ng-repeat。每行可以是不同的指令,具体取决于它的样式。同样,所有这些都在运行时发生。
我99%的路在那里。
正在正确编译指令并调用正确的列指令,而指令又编译正确的行数。一旦我们到达行/项目级别,我正在使用一个服务,它会为每个项目带回正确的指令。我选择服务方法的原因是我希望项目在其他模块中重用。
我遇到的问题是,一旦编译了页面布局,它会设置列然后设置行但不执行ng-repeat。我需要让ng-repeat循环,并调用我为每个项目使用的特定指令。
我认为与$ compile有关的问题以及Angular对DOM的了解。也许我需要在某个阶段进行$ compile或$ apply以使ng-repeat启动并将最终的Directive绑定到数据项。
**
旁注:如果我不使用服务,只需使用templateUri定义每个布局指令,它就能完美运行!
我可以采用这种方法,但理想情况下,我想摆脱在运行时下载一堆模板。此外,通过将参数传递到服务,我可以设计更多的布局,比构建单个模板文件更快更容易。
我已经设置了一个JS小提琴,其中包含了我如何接近所有这些的快速示例:
http://jsfiddle.net/joecarney/vE3Ls/6/
有些SO需要代码才能发表此评论:
<div ng-app="app" ng-controller="appPageController">
<div>
<div my-page></div>
</div>
</div>
答案 0 :(得分:0)
如果你在一个指令中使用scope: {}
它会创建一个新的范围,所以你的指令将无法访问控制器范围,除非你允许它,你开始做但看起来你复制并粘贴相同的东西全部:))
编译ng-repeat中的项目的指令无法访问项目。我从指令中删除了范围,并使用了attrs值来访问属性