最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - AngularJS The scope for dynamic content through $compile isn't attached to the controller scope - Stack Ove

programmeradmin3浏览0评论

When I generate a new element through a string that has a directive (that's why I need to pile) and that directive generates an association with a variable in the controller scope through "=", the variable in my controller isn't associated to the one in the directive.

I created a jsfiddle to show the example where the "door" ng-model value should be associated to all the directives model values.

See this fiddle: /

Another thing I notice is that the directive that run from elements present in the html show the correct association through the variables (controller and directive).

The html (there is the directive that binds <door>):

<body ng-app="animateApp">
    <div ng-controller="tst">
        <h2> Controller with its model </h2>
        <input ng-model="doorval" type="text"> </input>
        {{doorval}}
        <h2> Directive render directly from the html </h2>
        <door doorvalue="doorval"></door> <key></key>
        <h2> Directives that are piled </h2>
        <list-actions actions="actions"></list-actions>
    </div>
</body>

This is the directive:

animateAppModule.directive('door', function () {
    return {
        restrict: "E",
        scope: {
            doorvalue:"="
        },
        template: '<span>Open the door <input type="text" ng-model="doorvalue"> </input> {{doorvalue}}</span>',
        replace: true
    }
})

This is the controller:

var animateAppModule = angular.module('animateApp', [])

animateAppModule.controller('tst', function ($scope, tmplService) {
    $scope.doorval = "open"
    $scope.actions = tmplService;

})
animateAppModule.service('tmplService', function () {
    return [{
        form_layout: '<door doorvalue="doorval"></door> <key></key>'
    }, {
        form_layout: '<door doorvalue="doorval"></door> with this <key></key>'
    }]
})

And finally this is the directive that piles the string that has the directive that doesn't bind:

animateAppModule.directive('listActions', function ($pile) {
    return {
        restrict: "E",
        replace: true,
        template: '<ul></ul>',
        scope: {
            actions: '='
        },
        link: function (scope, iElement, iAttrs) {
            scope.$watch('actions', function (neww, old,scope) {
                var _actions = scope.actions;
                for (var i = 0; i < _actions.length; i++) {
                   //iElement.append('<li>'+ _actions[i].form_layout + '</li>');
                    //$pile(iElement.contents())(scope)
                    iElement.append($pile('<li>' + _actions[i].form_layout + '</li>')(scope))
                }
            })
        }
    }
})

What can I do to bind all the "door" ng-model values together? Where is the piled directive binding to?

When I generate a new element through a string that has a directive (that's why I need to pile) and that directive generates an association with a variable in the controller scope through "=", the variable in my controller isn't associated to the one in the directive.

I created a jsfiddle to show the example where the "door" ng-model value should be associated to all the directives model values.

See this fiddle: http://jsfiddle/aVJqU/2/

Another thing I notice is that the directive that run from elements present in the html show the correct association through the variables (controller and directive).

The html (there is the directive that binds <door>):

<body ng-app="animateApp">
    <div ng-controller="tst">
        <h2> Controller with its model </h2>
        <input ng-model="doorval" type="text"> </input>
        {{doorval}}
        <h2> Directive render directly from the html </h2>
        <door doorvalue="doorval"></door> <key></key>
        <h2> Directives that are piled </h2>
        <list-actions actions="actions"></list-actions>
    </div>
</body>

This is the directive:

animateAppModule.directive('door', function () {
    return {
        restrict: "E",
        scope: {
            doorvalue:"="
        },
        template: '<span>Open the door <input type="text" ng-model="doorvalue"> </input> {{doorvalue}}</span>',
        replace: true
    }
})

This is the controller:

var animateAppModule = angular.module('animateApp', [])

animateAppModule.controller('tst', function ($scope, tmplService) {
    $scope.doorval = "open"
    $scope.actions = tmplService;

})
animateAppModule.service('tmplService', function () {
    return [{
        form_layout: '<door doorvalue="doorval"></door> <key></key>'
    }, {
        form_layout: '<door doorvalue="doorval"></door> with this <key></key>'
    }]
})

And finally this is the directive that piles the string that has the directive that doesn't bind:

animateAppModule.directive('listActions', function ($pile) {
    return {
        restrict: "E",
        replace: true,
        template: '<ul></ul>',
        scope: {
            actions: '='
        },
        link: function (scope, iElement, iAttrs) {
            scope.$watch('actions', function (neww, old,scope) {
                var _actions = scope.actions;
                for (var i = 0; i < _actions.length; i++) {
                   //iElement.append('<li>'+ _actions[i].form_layout + '</li>');
                    //$pile(iElement.contents())(scope)
                    iElement.append($pile('<li>' + _actions[i].form_layout + '</li>')(scope))
                }
            })
        }
    }
})

What can I do to bind all the "door" ng-model values together? Where is the piled directive binding to?

Share Improve this question edited Apr 9, 2013 at 20:19 bbonamin 30.9k7 gold badges41 silver badges49 bronze badges asked Apr 9, 2013 at 20:18 sebastian.scandolosebastian.scandolo 531 silver badge3 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 5

You just have to pass the doorval reference down through all directives without skip any one. The problem was the listActions directive didn't had access to doorval in its scope. Check this out: http://jsfiddle/aVJqU/5/

@Danypype is basically correct as the problem occurs due to scope isolation, as explained in the documentation.

An alternative solution is to simply eliminate the scope isolation by removing the scope block from within the directive definition.

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论