Javascript 在运行时动态分配ng控制器

Javascript 在运行时动态分配ng控制器,javascript,angularjs,Javascript,Angularjs,在这种情况下,我需要动态更改控制器,以便相应地影响范围变量。一般结构: <div ng-controller="GameController"> // some general HTML which fits all types of games <div ng-controller="someScopeVar"> // Type of game // some game-type-specific ng-models that should r

在这种情况下,我需要动态更改控制器,以便相应地影响范围变量。一般结构:

<div ng-controller="GameController">
   // some general HTML which fits all types of games
    <div ng-controller="someScopeVar"> // Type of game
      // some game-type-specific ng-models that should respond to the change of controller, i.e scope
    </div
</div>

//一些适合所有类型游戏的通用HTML
//游戏类型
//一些游戏类型特定的ng模型应响应控制器的变化,即范围

这对于
ngRepeat
的工作方式是不同的。它之所以有效,是因为它编译了每个重复,这就是您在这里需要做的

例如:

mainCtrl = function($scope, $compile, $element) {
    $scope.someScopeVar = ctrl1;
    $scope.changeCtrl = function(id) {
        $scope.someScopeVar = id === 1 ? ctrl1 : ctrl2;
        var elm = $element.find('div');
        elm.replaceWith($compile(template)($scope));
    }
}

var ctrl1 = function($scope) { 
  $scope.name = 'World';
}

var ctrl2 = function($scope) {      
  $scope.name = 'John';
}
我们将每个控制器函数分配给
$scope.someScopeVar
,然后我们必须用新的控制器编译一个新元素并替换旧的元素

我不相信angular有能力像那样在飞行中更新控制器。可能是一个新功能的好主意


另一种选择是使用mixin模式来更新主作用域。你不会得到一个新的闪亮的范围,但它可以为你的目的工作

mainCtrl = function($scope, $compile, $element) {
    angular.extend($scope, ctrl1());
    $scope.changeCtrl = function(id) {
         angular.extend($scope, id === 1 ? ctrl1() : ctrl2());
    }
}

var ctrl1 = function() { 
  var obj = {};
  obj.name = 'World';
  return obj;
}

var ctrl2 = function() {      
  var obj = {};
  obj.name = 'John';
  return obj;
}

正如评论中所讨论的,
angular
有一个非常强大的功能/库,用于处理这些场景(具有强大的功能)

ui路由器
是开发功能部件的一个答案-说明,而不是在视图/url中思考(从主页引用):

AngularUI Router是AngularJS的路由框架,它允许您将界面的各个部分组织到一个状态机中。与Angular ngRoute模块中围绕URL路由组织的$route服务不同,
UI Router
围绕状态组织,这些状态可以选择性地附加路由以及其他行为

这里有一些非常有趣的博客帖子:

  • (本·施瓦茨)
…AngularJS的新路由器最有趣的不是路由器本身,而是它附带的状态管理器。您的目标不是针对给定url呈现的控制器/视图,而是状态。状态在继承权中管理,提供父状态继承和页面组件的复杂组合,同时本质上保持声明性

  • (乔尔·胡克斯)
…ui路由器
完全包含路由系统的状态机特性。它允许您定义状态,并将应用程序转换到这些状态。真正的优势在于它允许您解耦嵌套状态,并以优雅的方式进行一些非常复杂的布局

正是我们需要的点-解耦子状态实际上动态更改控制器。。。可以通过url更改,也可以只是状态更改(一个同级子级,而不是另一个没有url更改的同级子级)

你需要以不同的方式思考你的路线,但是一旦你开始考虑基于州的方法,我想你会喜欢它

最后,还有一些链接,我将其标记为ui路由器的圣杯

  • 。在实际操作中,我们可以看到ui路由器状态机是如何工作的。我们可以将列表作为父状态加载,然后我们可以选择行项目,这些行项目表示它们自己的子状态。。。当家长没有重新加载时(我试图解释更多细节)

  • -示例应用程序的基本代码。这是我见过的最好的文档化代码片段之一。。。花一些时间来研究,这将给你80%的答案:ui路由器如何工作


根据我的经验,这真的很适合小型应用程序以及大型系统。。。我喜欢……

我认为这个问题有误导性。你真的想动态设置控制器,还是仅仅更改$scope的内容?
someScopeVar
应该是一个控制器函数,你现在使用什么值?@Grundy,你是对的。我为控制器使用了一个字符串文字,它是在作用域之外定义的,而不是将控制器本身分配给
someScopeVal
。请以answer@Grundy,这适用于初始分配,但当我尝试更改它以响应用户单击事件时,它保持原样。您应该尝试深入观察
ui路由器
,以下是一些(最新)到SuperBasic资源的链接。此功能实际上是一个状态机,旨在根据状态更改更改应用程序的某些部分(可能取决于url,但不必如此)。您将只管理您的状态,这些状态可能有许多具有相关控制器的内部视图。更改状态-将注入具有不同控制器的相同视图(模板)。。。真的,请试着观察;)