Javascript 正在执行指令中作为字符串接收的angularJS代码

Javascript 正在执行指令中作为字符串接收的angularJS代码,javascript,angularjs,html,dom,Javascript,Angularjs,Html,Dom,我的用例是,在我的控制器中,我接收作为字符串的表单模板以及作为字符串的行为(角度代码)。现在我将它们传递到我的自定义指令中。我想要的是在DOM中绘制该模板,并在字符串中执行代码。这两个目标都已实现。我不能做的是以角度方式绑定数据,尽管行为字符串中的代码已注册到范围。让我一步一步地解释一下- 我的父模板是temp.html: <ngc-formmaker formhtml="fetchBillForm" formbehaviour="behaviour"></ngc-formma

我的用例是,在我的控制器中,我接收作为字符串的表单模板以及作为字符串的行为(角度代码)。现在我将它们传递到我的自定义指令中。我想要的是在DOM中绘制该模板,并在字符串中执行代码。这两个目标都已实现。我不能做的是以角度方式绑定数据,尽管行为字符串中的代码已注册到范围。让我一步一步地解释一下-

我的父模板是temp.html:

<ngc-formmaker formhtml="fetchBillForm" formbehaviour="behaviour"></ngc-formmaker>
这里formElement是一个服务,它返回一个具有两个属性的对象——formString和Behavior。此formString包含表单模板作为字符串,行为是对应于表单验证的代码,下拉列表/选择框上的一些逻辑等。此“行为”也是字符串

我的指令用于显示此模板,其功能是将此模板的行为绑定到范围中。指令是:

angular.module('ngcFormmaker', [])
.directive('ngcFormmaker', ['$compile','$timeout',function($compile, $timeout){
    return{
        restrict : 'AE',
        transclude : true,
        replace : true,
        link : function(scope, element, attrs){
            //bind the template
            element.html(scope.$eval(attrs.formhtml));
            $compile(element.contents())(scope);

            //bind the behaviour
            if(attrs.formbehaviour){
                 var stringifiedJS = scope.$eval(attrs.formbehaviour);
                 //scope.$eval(stringifiedJS);
                 eval(stringifiedJS);
            }
        }
    }
}])
对行为字符串的一点描述- “Behavior”字符串已定义了变量。例如-scope.showFormSubmit=true;。此范围变量用于显示提交按钮的模板中。此行为字符串还定义了块,例如-if(scope.form.dropdown.$viewValue=='no'){scope.showFormSubmit=false;}。以类似的方式,这里也定义了一些函数。一切都像绳子一样

由于函数和ifs,我不能使用范围。$eval of angular,它会抛出错误。所以我使用了javascript的eval

我的问题: 模板的范围变量绑定一次。但一开始只有一次。我可以这样说,因为他们在开始时显示提交按钮,但在从下拉列表中选择错误的选项后,他们不会隐藏提交按钮。实际上,我的模型/范围中的每个变量都是绑定的,并按照下拉列表中的选择更改值,但如果ELSE不执行,则只更改其中的代码

我所期望的答案是: 这样做的正确方法,可能是改变当前的方法,或者只是根据此方法解决问题

angular.module('ngcFormmaker', [])
.directive('ngcFormmaker', ['$compile','$timeout',function($compile, $timeout){
    return{
        restrict : 'AE',
        transclude : true,
        replace : true,
        link : function(scope, element, attrs){
            //bind the template
            element.html(scope.$eval(attrs.formhtml));
            $compile(element.contents())(scope);

            //bind the behaviour
            if(attrs.formbehaviour){
                 var stringifiedJS = scope.$eval(attrs.formbehaviour);
                 //scope.$eval(stringifiedJS);
                 eval(stringifiedJS);
            }
        }
    }
}])