【问题标题】:Problems with angular-ui-router - I cannot apply a filter to a repeat in a directiveangular-ui-router 的问题 - 我无法将过滤器应用于指令中的重复
【发布时间】:2026-01-15 22:30:01
【问题描述】:

我有一个问题,仅当我将指令作为 angular-ui-router 状态的一部分加载时才会出现。当我将指令直接添加到 index.html 时,一切都按预期工作。

这是一个演示我遇到的问题的 plunker: http://plnkr.co/edit/EzvTOiSzaf6jjCsBKM1e?p=preview

我有一个资源personResource,它返回一个对象数组。
控制器personController 查询资源,并将结果保存到$scope.people
这会填充一个模板list-people.html,该模板在指令listPeople 中加载。

我遇到的问题是另一个指令 filterPeople 包含带有过滤列表选项的单选按钮。

预期的结果是,如果我选择一个选项,它只会显示那些行的值与选项值匹配的行。实际发生的是,无论我选择什么,都会显示所有数据

【问题讨论】:

    标签: javascript angularjs angular-ui-router ngresource


    【解决方案1】:

    这是一个范围问题,您的模板有自己的子范围,无法看到彼此的值,因此当您在一个模板中设置 personFilter.color 时,您的模板将其用作过滤器并不知道.您可以使用 angularjs batarang 或插入一个简单的绑定来调试这些问题 (plnkr):

    </tbody></table>personFilter json: {{personFilter|json}
    

    要解决此问题,您可以在父作用域上设置 personFilter 对象,两个子对象都将使用继承的对象。只需意识到,如果您在子作用域上设置对象而不仅仅是一个属性,它只会在一个子作用域上设置该值,而其他作用域将继续使用继承的对象。您可能应该将控制器放在父级上。正在为内容和侧边栏实例化您的控制器,因此即使侧边栏中未使用数据,您也会查询您的人员两次...

    【讨论】:

    • 奇怪的是,我可以在我的控制器中为“personFilter”放置一个$scope.$watch,它正确地看到了从子模板更新的值。如果 personFilter 的作用域是子视图,那么父视图不应该不能看到它的值吗?见这里:plnkr.co/edit/16huKiaZeZMudrbn9LwU?p=preview personFilter 被输出到控制台。
    • 更新:所以使它起作用的一件事是使用$scope.$parent.people = ...$scope.$parent.personFilter = ...初始化变量。我仍然对一件事感到困惑——我认为通过为状态和指令指定相同的控制器,它们也将共享相同的范围。当为不同的对象指定相同的控制器时会发生什么?他们每个人都有自己的同一个控制器实例,具有不同的范围吗?
    • 如果没有controller as ... 语法,我认为没有控制器的实例,控制器函数只是执行并且可以修改传递给它的任何范围。如果您登录控制器功能,您可以看到它在两个不同的范围内运行,并且在手表中只有一个正在更新。 (plnkr)。如果您使用 angularjs batarang chrome 扩展,您可以看到所有创建的范围,或者通过检查 html,您可以看到任何具有 ng-scope 属性或类的元素都有自己的范围。