有没有办法从父作用域绑定到模型而不将其作为属性传递给指令的隔离范围?

时间:2014-03-28 17:12:49

标签: angularjs angularjs-directive

对于在指令模板中定义的输入,我想将其模型绑定到其父作用域上的属性。由于指令的多个实例位于页面上,因此需要隔离范围。我想避免必须将模型作为指令声明中的属性传递。看来这应该是可能的;但它不起作用。

指令:

catalogApp.directive("cmFieldFilterDtv", function () {
    return {
        templateUrl: "/templates/directives/field-filter-dtv.html",
        restrict: 'E',
        scope: {},
        link: function (scope, element, attrs) {
            var field = attrs.fid;
            var fieldCamel = field.toLowerCaseFirst();
            scope.fid = 'filter' + field;
            scope.model = scope.$parent['filters.' + fieldCamel];
            scope.options = scope.$parent['configFilter' + field];
        }
    }

});

模板:

<input id="{{fid}}"
       ng-model="model"
       data-kendo-multi-select
       data-k-options="options" />

页:

<cm-field-filter-dtv fid="PartNumber"></cm-field-filter-dtv>
<cm-field-filter-dtv fid="PartType"></cm-field-filter-dtv>
<cm-field-filter-dtv fid="Status"></cm-field-filter-dtv>

输入的选择更改不会被推送(通过模型绑定)到父作用域的属性。

2 个答案:

答案 0 :(得分:0)

为什么你不能传递它?在任何一种情况下,你都可以这样做:

catalogApp.directive("cmFieldFilterDtv", function () {
    return {
        templateUrl: "/templates/directives/field-filter-dtv.html",
        restrict: 'E',
        scope: {},
        link: function (scope, element, attrs) {
            var field = attrs.fid;
            scope.fieldCamel = field.toLowerCaseFirst();
            scope.fid = 'filter' + field;
            scope.options = scope.$parent['configFilter' + field];
        }
    }

});

模板:

<input id="{{fid}}"
       ng-model="$parent['filters.' + fieldCamel]"
       data-kendo-multi-select
       data-k-options="options" />

答案 1 :(得分:0)

scope.$parent应该允许您访问父作用域。看起来问题可能就在这里......

scope.model = scope.$parent['filters.' + fieldCamel];

父作用域是否具有名为'filters.' + fieldCamel的属性(例如$scope["filters.foo"])?或者它是否有一个名为filters的属性,其中包含其他值(例如$scope.filters.foo)?如果是后者,则需要将其更改为...

scope.model = scope.$parent['filters'][fieldCamel];

scope.model = scope.$parent.filters[fieldCamel];

但正如其他人所提到的,您不希望将指令耦合到其父作用域。考虑传递所有内容。