【问题标题】:angular reloads controller when using a directive使用指令时角度重新加载控制器
【发布时间】:2016-10-18 10:16:27
【问题描述】:

我的 ui 路由状态如下:

        .state('projects', {
            abstract: true,
            url: "/?username&token",
            templateUrl: "projects/views/Projects.html",
            controller: 'ProjectController'
        })
       .state('projects.mine', {
            url: "mine",
            templateUrl: 'projects/views/ProjectsMine.html'
        })
        .state('projects.all', {
            url: "all",
            templateUrl: 'projects/views/ProjectsAll.html'
        })

我做了一个指令:

    app.directive('description', function(){
        return{
            restrict: 'E',
            templateUrl : 'projects/views/directives/ProjectDescription.html',
            controller:ProjectController
        }
    });

我为状态templateUrls制作了两个完全相同的文件,唯一的区别是所有的模板都使用了描述指令,例如:

<description></description>

另一个使用 templateUrl 的内容作为 description 指令(复制 1on1),当不使用指令但 templateUrl 文件的内容重新加载不会发生。

一切正常,但是当我转到“所有”路线时,ProjectController 会重新加载。 该指令如下所示:"

<table>
  <tr >
      <td><b>name</b> </td>
      <td>{{project.name}}</td>
  </tr>
  <tr >
      <td><b>owner</b> </td>
      <td>{{project.owner}}</td>
  </tr>
<table>

指令以 ng-repeat 的形式添加(处于“全部”状态):

 <div ng-repeat="project in project|filter:searchText">
     <description></description>
 </div>

链接到我的 html 中的状态:

    <a ui-sref=".mine()"><button>my projects</button></a>
    <a ui-sref=".all()"><button>all projects</button></a>

    <div ui-view></div>

另一个“我的”使用指令的内容并重新加载控制器。 当从“我的”转到“全部”时,当我从“我的”转到“全部”时,控制器不会重新加载

如何保持一切原样但避免重新加载控制器?

【问题讨论】:

  • 控制器和指令不是持久的。如果您想要持久数据,请使用服务
  • @lightswitch05 我使用服务来获取数据。在控制器中,因此我使用项目的嵌套状态在表之间切换。 angular-ui.github.io/ui-router/#nested-states--views
  • 我明白了,我误解了你的目标。您希望projects.mine 继承自projects.all,并对列表应用额外的过滤器。不知道如何使用 UI-Router 做到这一点。但这绝对是一个 UI-Router 问题。您可能想改写标题和问题以澄清这不是一个简单的控制器和指令问题
  • @lightswitch05 不,我有一个页面,其中我为不同的表使用了两个嵌套状态,例如这里embed.plnkr.co/IzimSVsstarlFviAm7S7/preview,其中“列表”和“段落”这两个嵌套状态都有不同的模板。一个使用指令,另一个使用dosnt,带有指令的一个使我的控制器重新加载,一个没有指令的dosnt。我不希望控制器重新加载,因为数据不需要重新加载。

标签: javascript angularjs angular-ui-router


【解决方案1】:

删除

 controller:ProjectController 

修复它,使用 controller:'controllerName' 会导致为每个创建的指令创建一个控制器。

【讨论】:

  • 感谢这个答案,我意识到它会自动绑定到父控制器。
【解决方案2】:

你必须像函数调用一样链接到路由:

<a ui-sref=".list()" class="btn btn-primary">List</a> <a ui-sref=".paragraph()" class="btn btn-danger">Paragraph</a>

【讨论】:

  • 控制器仅在其路由处于活动状态时才处于活动状态。当您离开指令和路由时,它的控制器将从范围中移除并被垃圾收集。如果您不希望控制器“重新加载”,那么您不能让它离开范围。您可以“隐藏”一个指令以将其保持在范围内而不离开其路线。否则,控制器将不得不重新加载。
  • @ lightswitch05 你能提供一个链接吗?我通过从指令中删除控制器语法来使其工作。 ui-router 嵌套状态的全部意义在于您不需要创建新控制器并且可以切换当前视图的一部分。
  • 指令控制器和独立控制器是两种不同的动物。请注意,在角度 1 中使用独立控制器可能会导致错误的设计决策。独立控制器已从 Angular 2 中删除。最好有一个总体指令(带有内部控制器)保持在范围内并与子状态共享数据,然后让一个整体控制器做同样的事情。很高兴你能弄清楚 +1
  • 如果您有一个包含要循环的项目的列表,并且每个项目都想显示一个指令(如 ),那么这对于 ng-repeat 是如何工作的。您确实需要一个独立的 ng-repeat 控制器来保存项目吗?
  • 这个例子有一个带有列表的父指令,以及该列表中每个项目的子指令plnkr.co/edit/CnlVxJJyCx2f9RBFXcnc?p=preview
猜你喜欢
  • 2016-03-24
  • 2016-06-08
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
  • 2016-08-06
  • 2015-02-27
  • 2015-07-20
  • 2016-06-21
相关资源
最近更新 更多