0

我有两个指令,resourceformajax. 他们来了:

资源

resource.coffee(部分)

    (...)
    ($http, $location, $compile) ->
        restrict: "E"
        templateUrl: templateUrl
        scope:
          action: "@"
        transclude: true

        link: (scope, element, attributes) ->
          (...)

资源.html

<div class="resource">
    <style type="text/css">
        .resource .new-record {
            padding: 10px;
        }
    </style>
    <button class="button" ng-click="addRecord()">+ Dodaj wiadomość</button>
    <div class="new-record" ng-show="showAddForm">
        <formajax action="{{action}}" />
    </div>

    <div ng-transclude></div>

</div>

和formajax

formajax.coffee(部分)

    (...)
    ($http, $location) ->
        restrict: "E"
        scope:
            action: "@"
            title: "@"
            formStatus: "="
            additionalFields: "="
            onData: "&"

        templateUrl: templateUrl

        link: (scope, element, attributes) ->
            (...)

formajax.html

<form method="post" action="{{action}}" role="form" class="form-ajax">
    <fieldset>
        <legend>{{title}}</legend>
        <div ng-bind-html-unsafe="form"></div>
        <button type="button" ng-click="submit()" class="btn button">Wyślij</button>
    </fieldset>
</form>

自举

这就是我开始一切的方式:

<resource action="/api/messages/">

问题是,在链接时action没有传递给,而不是. 它在里面,它最终是可用的,但我想它稍后会绑定,为时已晚,无法与期望的价值联系起来。也许和异步加载会导致问题,使某些绑定不可能或未处理?formajaxundefined/api/messages/$watch scope.actionresourceformajaxtemplateUrl

4

2 回答 2

0

我很生气,做了这样的事情:

    ($http, $location, $compile) ->
        restrict: "E"
        templateUrl: templateUrl
        scope:
          action: "@"
        transclude: true

        link:
          pre: (scope, element, attributes) ->
            scope.action = attributes.action

          post: (scope, element, attributes) ->
            scope.form = $compile("""<formajax action="#{scope.action}" />""") scope

            scope.showAddForm = false
            scope.addRecord = ->
              scope.showAddForm = true

哈克,但有效;)

于 2013-09-12T15:03:46.387 回答
0

我认为您可以尝试通过将父指令的控制器传递给子指令,值将在两个指令中同时绑定。我在这里做了一个例子:http: //jsfiddle.net/DotDotDot/pVYL6/3/(我不能使用你的代码,所以我用了更短的代码)

实际上,我在第一个指令(你的resource指令)中添加了一个控制器,我在其中定义了一些 getter:

.directive('parent',function(){
return {
    scope:{action:'@'},
    controller: function($scope, $element, $attrs) {
       this.getAction=function(){
           return $scope.action; 
        }
    }   
}
});

指令获取参数中的动作,该动作可以通过getAction(). 我使用this而不是$scope因为目标是在另一个指令中使用控制器。您仍然可以添加resource指令的所有代码,只需在控制器中添加一个 getter。
然后,在子指令中,formajax您将需要父指令控制器,并将其传递给链接函数:

....
    require:'^parent',
    link:function(scope, elt, attr, parentCtrl){
        scope.$watch(function(){
            scope.childaction=parentCtrl.getAction()
        });

编辑:您仍然需要 $watch 更改
现在您可以从子指令中的父指令访问所有值

我希望这能帮到您,

玩得开心

于 2013-09-12T12:36:09.700 回答