【问题标题】:Angularjs aliasing scopesAngularjs别名范围
【发布时间】:2016-02-14 17:36:29
【问题描述】:

我还在学习 Angular,如果问题是无稽之谈,请原谅我

我有一个具有这种层次结构的对象:

{
    a : [...],
    b : [{
        a: [...]
    }, {
        ...
    }]
}

也就是说,我对主要对象的直接子对象和间接子对象具有相同的对象模型。也就是说,名为“a”的两个属性具有相同的字段

我构建了一个由 ng-view 管理的视图,并认为可以在主控制器和迭代 b 元素的 ng-repeat 中调用它。但是,我不知道如何更改传递给管理“a”的视图的范围:

主视图是这样制作的:

<div ng-controller="MainController as ctrl">
    <div ng-include="'subView'"/>
    <div ng-repeat="bElement in ctrl.b">
        <div ng-include="'subView'"/>
    </div>
</div>

在 subView 中,我可以访问像 bElement.a 这样的元素,因为我获得了与外部控制器相同的范围。但是如何访问根元素的属性a呢?

我需要的是像 ng-repeat 这样的东西,它允许为属性创建别名,以便可以覆盖它,但没有“重复”。

我也尝试过以这种方式使用 ng-init:

<div ng-controller="MainController as ctrl">
    <div ng-include="'subView'" ng-init="list = ctrl.a"/>
    <div ng-repeat="bElement in ctrl.b">
        <div ng-include="'subView'" ng-init="list = bElement.a"/>
    </div>
</div>

但只有第二次调用有效

【问题讨论】:

    标签: javascript angularjs angularjs-ng-repeat ng-repeat angularjs-ng-include


    【解决方案1】:

    上面的代码应该可以工作,但我在这里看到的唯一缺失的是,你没有正确关闭ng-include div。所以它停止浏览器不会考虑确切的下一个div & 内部ng-repeat div 不会得到渲染。

    <div ng-include="'subView'" ng-init="list = ctrl.a"/>
    

    所以它应该正确关闭div,以便浏览器获取相同的下一个元素。

    <div ng-include="'subView'" ng-init="list = ctrl.a"></div>
    

    Sample Plunkr 以上问题。


    Solved working Plunkr list 变量在子级中更新。

    虽然它会起作用,但我在当前的实现中看到了一些架构威胁,因为当前的实现看起来非常紧密耦合。需求的任何微小变化都可能导致对其进行返工。因为ng-init 将来可能会伤害你。如果假设您的集合将在指定的时间间隔内更新(此时ng-init 表达式不会在模板的第二次渲染时评估)

    【讨论】:

    • 谢谢:我发现我的问题确实是没有重新评估ng-init。你会建议做什么呢?我想知道一个指令是否可以干净地做到这一点
    • 你为什么不选择具有隔离范围的指令?
    • 指令是要走的路。这是进行范围封装和别名的唯一方法,还是更简单的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多