与动态属性内AngularJS定制指令NG-重复和双向绑定(AngularJS custom dir

2019-10-21 05:21发布

我敲我的头挂在墙上在这个好几天,最后决定发布这个问题,因为我无法找到答案符合我想要做的事。

背景:我建立一个动态的形式建立的平台,描述了JSON结构形式元素这样的 -

    {
        "name": "email",
        "type": "email",
        "text": "Your Email",
        "model": "user.profile.email"
    } 

然后在视图我有一个递归NG重复,包括这样的字段模板 -

<script type="text/ng-template" id="field.html">
    <div ng-if="field.type === 'email'" class="{{field.class}}">
        <p translate="{{field.text}}"></p>
        <input type="{{field.type}}" name="{{field.name}}" class="form-control" dyn-model="{{field.model}}">
    </div>
</script>

正如你看到的,我使用自定义指令dynModel创建与字符串值模型的插值的NG-model属性。 到目前为止,做的好。

现在我有一个更复杂的场景中,我有一个可以通过点击添加按钮或removeMe按钮来添加或删除字段的集合。 见下文 -

         {
            "name": "urls",
            "type": "collection",
            "text": "Your Profile URLs",
            "model": "user.profile.urls",
            "items": [
                {
                    "name": "url",
                    "type": "url",
                    "text": "Facebook URL",
                    "model": "url"
                },
                {
                    "name": "url",
                    "type": "url",
                    "text": "Facebook URL",
                    "model": "url"
                }
            ],
            "action_button": {
                "name": "add",
                "type": "action",
                "action": "addURL"
            }
      }

 <div ng-if="field.type === 'collection'">
    <button class="btn btn-info"  dyn-click click-action="{{field.action_button.action}}" click-model="{{field.model}}">{{field.action_button.text}}</button>
     <div dyn-ng-repeat="item in {{field.model}}" >
        <div ng-repeat="field in field.items" ng-include src="'field.html'"></div>
     </div>
</div>

正如你会发现,我还有一个自定义的指令,它利用插值照顾{{field.model}}从以前的NG-重复(未显示)。

现在到了问题的关键所在。 当你在模板中看到的,我有嵌套NG-重复,通过user.profile.urls第一个迭代,第二个迭代通过JSON的现场参数,创建HTML标记,等其中的一个领域是一个按钮用来多个URL添加到列表(action_button)。 当我按一下按钮,我希望它引发我的控制器的功能,有效地增加一个新的子父模型(user.profile.urls)。 然后我也希望每个URL,现有的和新的,以旁边有一个删除按钮,这将是动态的,会从模型中删除特定项目。

如果你看到上面的代码中,我有一个自定义指令DYN-点击,在读

click-action="{{field.action_button.action}}" 

这包含了函数名(addURL)被称为驻留在我的控制器和模型

click-model="{{field.model}}"

(user.profile.urls),以该新产品被添加。 这是行不通的。 这样做的原因复杂的是,我有多层嵌套,并在每个级别有需要进行插值和约束动态元素。 该指令DYN-点击貌似现在这种权利 -

exports = module.exports = function (ngModule) {
    ngModule.directive("dynClick",function() {
        return {
            restrict: 'A',  
            link: function(scope,element,attrs) {
                $(element).click(function(e, rowid){
                    scope.clickAction(scope.clickModel, scope.$index);
                });
            }
        };
    });
};

有了这个代码,当我所再现的形式的添加按钮,单击,在$(元素)。单击方法上面的代码被执行给下面的错误 -

遗漏的类型错误:未定义是不是一个函数

在DYN-点击指令{},用不同的错误,他们都没有与模型的双向绑定和调用函数如预期完全工作:我曾尝试与范围一些不同的东西。

救命!

编辑-1 - 请评论:

        $(element).click(function(e, rowid){
            scope.$eval(attrs["clickAction"])(scope.$eval(attrs["clickModel"]), scope.$index);
        });

编辑-2:plunker在这里- http://plnkr.co/edit/DoacjRnO61g4IYodPwWu?p=preview 。 仍在调整它得到它的权利,但你们应该能够看到必要的部分。 谢谢!

编辑-3:谢谢塞巴斯蒂安。 新plunker在这里- http://plnkr.co/edit/Z6ViT7scubMxa17SFgtx?p=preview 。 与field.items NG-重复的问题依然存在。 出于某种原因,没有被执行的内部NG重复。 有任何想法吗? 何塞普,塞巴斯蒂安?

文章来源: AngularJS custom directive within ng-repeat with dynamic attributes and two way binding