Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何习惯性地手动销毁范围&;在AngularJS中重新创建它?_Javascript_Angularjs_Angularjs Scope_Angular Ui Router - Fatal编程技术网

Javascript 如何习惯性地手动销毁范围&;在AngularJS中重新创建它?

Javascript 如何习惯性地手动销毁范围&;在AngularJS中重新创建它?,javascript,angularjs,angularjs-scope,angular-ui-router,Javascript,Angularjs,Angularjs Scope,Angular Ui Router,我正在尝试使用UI路由器管理应用程序中的状态更改。我认为,在动态路由上更改状态会导致当前范围被破坏,并且为模板创建的新范围将与新内容一起重新插入,例如: $stateProvider .state('foo', { url: '/:id' views: { 'foo@': { templateUrl: 'partials/foo.html', controller: 'Foo', controllerAs: 'Foo

我正在尝试使用UI路由器管理应用程序中的状态更改。我认为,在动态路由上更改状态会导致当前范围被破坏,并且为模板创建的新范围将与新内容一起重新插入,例如:

$stateProvider
  .state('foo', {
    url: '/:id'
    views: {
      'foo@': {
        templateUrl: 'partials/foo.html',
        controller: 'Foo',
        controllerAs: 'FooCtrl as foo'
      }
    }
  });
我认为上述状态将在用户每次导航到具有不同id的路由时销毁并创建FooCtrl。因此,在每个路由更改上运行位于FooCtrl中的初始化函数,以使用注入控制器的服务中的正确数据初始化当前视图。我一直在控制器中侦听要在这些状态更改上运行的
$scope.$destroy
函数,但没有调用它们

我想知道的是,创建和销毁控制器以获得上述功能的惯用方法是什么?还有,在AngularJS中有没有更惯用的方法来实现同样的目标

谢谢

更新: 为了在使用
$state.go()
时销毁并重新创建控制器,必须将
{reload:true}
选项作为第三个参数传递,如下所示

$state.go('foo',{id:'1'},{reload:true})

如Radim所述,为了重新实例化控制器,不需要调用
{reload:true}
。目前,我正在监听
$stateChangeStart
,以确保状态实际上正在更新。在看到它之后,我正在监听('$destroy')上的
$scope.$on,但它没有启动。因此,出于某种原因,状态正在更改,而控制器没有被销毁&重新实例化

更新工作状态 我犯的错误是,在我最深的嵌套视图中,我使用的是绝对路径。这似乎将控制器从一个状态持续到另一个状态。当我将嵌套视图设置为相对视图时,它们将被销毁,并在状态更改时重新创建,如Radim所述。

有。默认情况下,UI路由器正在执行您期望的操作。它在每个更改状态下重新实例化控制器,即即使只是更改了一个参数(id)

我只是稍微调整了上面的状态定义:

  // instead of this
  .state('/:id', {
      views: {
        'foo@': {
          templateUrl: 'partials/foo.html',
          controller: 'Foo',
          controllerAs: 'FooCtrl as foo'
        }
      }
    })

  // wee need this
  .state('myState', {
      url: '/:id',
      views: {
        'foo@': {
          templateUrl: 'partials/foo.html',
          controller: 'FooCtrl',
          controllerAs: 'foo'
        }
      }
    })
当我们使用不同的
id
导航到状态
'MyState'
时,这个
FooCtrl
会登录到控制台

// register controller
.controller('FooCtrl', FooCtrl)

// this function will be our controller, called any time new id is passed
function FooCtrl($scope, $stateParams) {
    console.log('init with id: ' + $stateParams.Id + ', state params:')
    console.log($stateParams)

    var foo = {};
    foo.$stateParams = $stateParams
    return foo;
};

FooCtrl.$inject = ['$scope', '$stateParams'];

在Kirill的

调查
选项
,特别是
重新加载
重新加载搜索
中检查它,在UI路由器的API文档中,它说当前存在一个导致重新加载无法重新启动控制器的错误。目前,github上有一个公开的问题,尽管似乎有一个使它在控制器中工作的黑客。这意味着我必须在每个控制器中侦听
$stateChangeStart
,然后从每个控制器内部启动“`$state.reload()`”。这似乎是一个很大的开销,有没有更惯用的方法?因为有一个bug,正如你所说的,不可能有惯用的方法。无论如何,这将是一个解决办法。我首先想到的是换一种状态。例如,切换到具有修改参数的状态之前的父状态。默认情况下,这将强制ui路由器停用,然后再次激活感兴趣的状态。但是如果用户手动切换url,它将不起作用Hey Radim,对不起,我忘了在问题中包含url。我不知道为什么我没有看到类似的行为。我发现这是解决我问题的一个办法。使用
$state.go()
时,未重新启动控制器,但是当使用上面的解决方法时,
$scope.$destroy
被触发,控制器被重新启动。我正在用
ng click
改变状态,而不是
ui sref
,然后调用
$state.go
ng click
触发的函数中。。。我是否缺少一个不会导致控制器重新启动的
$state.go
选项?再次感谢拉迪姆!嗯,
ng单击
,内部的
$state.go
是一样的。事实上,directve
ui-sref
正在幕后使用
$state.go
。我在这里创建了更新的、扩展的plunker:向您展示,它每次都在重新启动控制器。关键是我们必须传递不同的id,必须有一些更改。。。否则,状态将不会更改。因此,请仔细检查您的参数定义,并确保您正在发送一些参数以确保(作为我的)-无需显式调用reload:true。否。如果参数发生变化。如果我们从id:1转到id:2,所有这些都将按预期工作。但是,如果我们从id:1转到id:1,那么实际上我们不会改变状态。这就是为什么没有出现“控制器的再创造”。状态更改意味着:状态(自身)或其参数不同。否则,UI路由器将尽力避免重新初始化。因为这不是一种状态改变。希望现在有所帮助..Radim,当我调用$state.go而不重新加载设置为true时,控制器中的初始化函数在初始加载后不会启动。因此,在我的应用程序中,如果我从一个状态切换到另一个状态,虽然视图中的情况可能会发生变化,但与这些视图关联的控制器永远不会被销毁,因此也不会重新实例化以重新运行初始化代码。我不知道为什么我没有看到和你的劫掠者一样的行为。再次感谢您的帮助,我将进一步调查为什么我的应用程序不能正常运行。