使用角度子控制器进行部分视图?

时间:2016-12-15 15:57:51

标签: angularjs model-view-controller

我正在创建一个包含十几个问题类型的调查问卷' (多项选择,滑块,检查所有适用的内容等)

每个响应类型的定义基本上都存储为db中的键值对。 例如:

多项选择响应类型

  

设置(一次性小部件特定属性)

     

[0]键:'选项数量',值:3

     

[1] key:'选择类型',值:' radio'

     

选项(n个大小的选项数组)

     

[0]键:'红色',值:1

     

[1]键:'黄色':值:2

     

[2] key:' blue':value:3

滑块响应类型

  

设置(一次性小部件特定属性)

     

[0]键:'最小值',值:1

     

[1] key:' Maximum',value 10

     

选项(n个大小的选项数组)

     

(没有选项)

请注意,每种响应类型都需要使用唯一设置来告诉它如何构建此窗口小部件。 (滑块需要'滴答数'值,多项选择需要n个大小的文本标签数组)

所以我需要一个针对每种响应类型的HTML片段 - 我想 - 每个人都需要自己的控制器。

在我的问题页面视图中:我加载了这样的模板:

 <div ng-include src="vm.getResponseTemplate(vm.question.responseType)"></div>

给我一​​个网址:

&#34;问题/响应/滑块template.html&#34;

&#34;问题/响应/选择题-template.html&#34;

我的问题是,因为我需要每个控制器的控制器,我该如何加载它?它需要访问页面的父控制器,因为它保存了所有设置。

我看过嵌套的控制器,但我并不完全确定在我的情况下我是如何实现的。

我可以在问题页面添加类似的行来加载脚本吗?

<script src="questions/responses/slider-controller.js"></script>

如果是这样,滑块控制器包含什么?&#34;

问题页面的控制器如下所示:

(function () {
    appModule.controller('tenant.views.questions.index', [
        '$scope', 'abp.services.app.survey',
        function ($scope, surveyService) {
            var vm = this;        }
    ]);
})();

我做...

(function () {
    appModule.controller('tenant.views.questions.responses.slider'...

我的意思是,我可以设置它,但现在它的范围限定在特定的控制器上,并且无法访问父控制器。

3 个答案:

答案 0 :(得分:0)

由于您使用ng-include来包含模板,因此概念将类似于

<div ng-controller="ParentCtrl">
    // Template 1
    <div ng-controller="SliderCtrl">
    </div>
    // Template 2
    <div ng-controller="MultipleChoiceCtrl">
    </div>
</div>

相同
<div ng-controller="ParentCtrl">
    // Template 1
    <ng-include="'slider-template.html'"/>
    // Template 2
    <ng-include="'multiple-choice.html'"/>
</div>

您只需在所包含的每个模板中添加ng-controller,如下面的示例

<强>滑块template.html

<div ng-controller="sliderCtrl">
   // setup your code
</div>

<强>选择题-template.html

<div ng-controller="MultipleCtrl">
   // setup your code
</div>

并在js控制器中定义了控制器

Js控制器

(function () {
    appModule.controller('ParentCtrl', [
        '$scope', 'abp.services.app.survey',
        function ($scope, surveyService) {
            var vm = this;        }
    ]).controller('SliderCtrl', [
        '$scope', 'abp.services.app.slider',
        function ($scope, surveyService) {
            var vm = this;        }
    ]).controller('MultipleCtrl', [
        '$scope', 'abp.services.app.slider',
        function ($scope, surveyService) {
            var vm = this;        }
    ]);
})();

答案 1 :(得分:0)

这令人沮丧。当我把它吐出到控制台时,我可以看到我对象中的属性:

var vmChild = this;
vmChild.parent = $scope.$parent;
console.log(vmChild)

Object:  parent > m > $parent > vm > responseValue > Array[1] > 3

3 是我父母控件中的实际值。这是我想要阅读的价值。

我甚至可以这样做

console.log($scope.$parent.$parent);

并向下钻取我的值:

vm > responseValue > Array[1] > 3

然而,当我这样做时:

console.log(vmChild.parent.$parent.vm);

我明白了:

vm > responseValue > Array[0]

答案 2 :(得分:0)

我认为你错过了angularjs主要概念的目的。你应该使用指令。

假设您的表单正在使用控制器FormCtrl和模板form.html,然后在form.html中您可以执行以下操作: (为简单起见,让我们假设你在FormCtrl中有一个方法告诉每个小部件它们是什么。例如whatAmI(设置)等。另一种获取设置的方法 - 好吧也许这是不必要的)

<form>
<div ng-repeat="setting in ctrl.settings">
    <my-checkbox ng-if="ctrl.whatAmI(setting) == 'checkbox'" 
        config="ctrl.getMyConfig(setting)"><my-checkbox>
    <!-- ... and so on -->
</div>
</form>

所以,现在,如果您需要将指令的属性更新到外部作用域,一个好的方法是在指令中创建一个隔离的作用域,并对需要更新的属性使用双向绑定向上。然后给出指令这个属性作为属性(免责声明,如果你计划在不久的将来将某些时间升级到angular2,那么你应该避免双向绑定,并使用&amp; -binding,但......它&#39 ;不像双向绑定那么直接......这是一个很难的选择)

这样的事情:

<my-checkbox property1="ctrl.property1"....></my-checkbox>

在指令中:

myMod.directive('myCheckbox', {
  restrict: 'EA',
  scope: {}, // Use an isolated scope
  controller: 'MyDirectiveController',
  bindToController: {
    config: '@', // this is a 1-way binding (see note below)
    property1: '=' // define 2-way-binding with the '='
  },
  controllerAs: 'my-ctrl', // controller's name on our template
  templateUrl: 'my-checkbox.html'
});

注意:如果您只想将内容从顶部传递给指令,那么您不需要双向绑定,单向绑定是正确的做法(@)...这里的问题是,当使用单向绑定时,变量将作为字符串传递,因此您必须将您的stringyfied配置解析回实际变量,例如JSON。最后,它可以在每个摘要周期中保存一些性能,但您也可以使用双向绑定来简化操作....我猜这个决定还取决于数量。

另一方面,如果你不知道在ng-repeat循环中想要传递给my-checkbox指令的FormCtrl的哪个属性,那么我会简单地给它提供属性。配置,FormCtrl中的getMyConfig()方法必须添加。这也意味着你必须对bindToScope上的config属性使用双向绑定。

相关问题