以编程方式创建控制器的新实例

时间:2016-06-14 08:27:59

标签: angularjs controller

所以这是我的问题,我在父控制器中有一些函数/变量

function parentController($scope) {

    $scope.numberOfChildren = $scope.numberOfChildren + 1 || 1;
    console.log($scope.numberOfChildren);

    $scope.someFunction = function(argument) {
        // do stuff
        $scope.someVariable = result of the function
    }
}

我在另外两个控制器中调用此控制器,这些控制器是指令控制器,而在同一视图中调用

function firstChildController ($scope, $controller) {

    var aVariable = 1;
    $scope.otherVariable = 10;

    $controller('parentController', {$scope: $scope});

    $scope.someFunction(aVariable);
}

function secondChildController ($scope, $controller) {

    var aVariable = 6;
    $scope.otherVariable = 11;

    $controller('parentController', {$scope: $scope});

    $scope.someFunction(aVariable);
}

我想要的是,不要分享两个孩子的父范围。 现在,只有一个父控制器的实例,所以当我在同一个视图上调用两个指令时,我得到$ scope.numberOfChildren === 2。 我想要的是这个父控制器被加载两次但是具有独立的范围($ scope.numberOfChildren === 1在每个子控制器中)

我设法在视图模板中使用ng-controller并删除$ controller调用,但我想以编程方式执行此操作。 (每次调用指令时,我都不想写相同的ng-controller代码。)

<div ng-controller="parentController">
    <first-directive></first-directive>
</div>
<div ng-controller="parentController">
    <second-directive></second-directive>
</div>

最后,为了保持项目代码的同质性,如果可能的话,我宁愿不使用this和vm来完成工作。

2 个答案:

答案 0 :(得分:1)

parentController 有自己的范围,当您以这种方式实例化$scope时,它会对$controller('parentController', {$scope: $scope})进行操作@IBAction func sendPressed(_ sender: AnyObject) { let content = UNMutableNotificationContent() content.title = "Hello" content.body = "What up?" content.sound = UNNotificationSound.default() // Deliver the notification in five seconds. let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false) let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger) // Schedule the notification. let center = UNUserNotificationCenter.current() center.add(request) { (error) in print(error) } print("should have been added") } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let center = UNUserNotificationCenter.current() center.requestAuthorization([.alert, .sound]) { (granted, error) in } }

查看这个简单的演示fiddle

您的案例中的问题可能是由共享相同范围的指令引起的,因此,将相同的范围传递给父控制器。

答案 1 :(得分:0)

您期望与系统运行的方式完全相同:范围不在两个控制器之间共享。

在html中使用ng-controller时,将创建一个新的范围(控制器实例)。从上面的代码中,将创建两个控制器实例。 您可以通过向html添加{{$ id}} 来查看,并查看范围实例的ID。

<div ng-controller="parentController">
    {{$id}}
    <first-directive></first-directive>
</div>
<div ng-controller="parentController">
    {{$id}}
    <second-directive></second-directive>
</div>

如果您看到{{numberOfChildren == 2}}表示您的代码在某处错误,而不是通过共享范围问题。