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