基于调用元素改变控制器的行为

时间:2013-01-15 10:52:14

标签: angularjs

我有两个不同视图使用的控制器:

<div ng-controller="MyCtrl" ng-include="slice = false">
    <span ng-repeat="value in values">{{ value }}</span>
</div>
...
<span ng-controller="MyCtrl">
    <div ng-repeat="value in values">{{ value }}</div>
</span>

控制器:

var MyCtrl = function($scope){
    $scope.values =  ['a','fancy','array'];
    // if called from span
    //$scope.values =  ['a','fancy','array'].slice(2);
}

我想知道是否可以检测控制器被调用的元素来改变控制器的行为。

更新:根据@ matys84pl的回答,这是我的新控制器

MenuCtrl = function($scope) {
    $scope.slice = true;
    if($scope.slice === false) { // wont go inside 
        $scope.data = ['a','fancy','array'];
    } else {
        $scope.data = ['a','fancy','array'].slice(2);
    }
    console.log($scope.slice); // still true for both
}

2 个答案:

答案 0 :(得分:1)

规则是控制器不应该知道视图...所以你应该使用ngInit将一些东西从视图传递给控制器​​,如下所示:

<div ng-controller="MyCtrl">
    <span ng-repeat="value in values">{{ value }}</span>
</div>
...
<span ng-controller="MyCtrl" ng-init="isDifferent = true">
    <div ng-repeat="value in values">{{ value }}</div>
</span>

然后在控制器中检查isDifferent值。

更新:带有工作示例的plunker:http://plnkr.co/edit/zUgLSQcAaZX5j6JBoQAO

答案 1 :(得分:0)

<div ng-controller="MyCtrl" behavior=2>...

请原谅我懒惰的js - 我习惯了coffeescript

var MyCtrl = function($scope, $attrs){
    if $attrs.behavior != 2
        $scope.values =  ['a','fancy','array'];
    else
        $scope.values =  ['a','fancy','array'].slice(2);
}

我猜你可以通过交换$ attrs for $ element并改变你的测试来做类似的事情。