Javascript 将带有函数的JSON对象发送到另一个指令';s控制器
我想将带有函数模板的JSON对象从Javascript 将带有函数的JSON对象发送到另一个指令';s控制器,javascript,json,angularjs,Javascript,Json,Angularjs,我想将带有函数模板的JSON对象从app.controller发送到另一个指令控制器。我决定将此变量作为内部指令元素的属性发送。问题是我的指令控制器中$attr.valueAtt内的对象是“[object object]”,我无法获取它: 我的代码: var value = ( [{ functionLabel:'Fun', functionTemplate: function(param1,param2){ alert(param1); },
app.controller
发送到另一个指令控制器。我决定将此变量作为内部指令元素的属性发送。问题是我的指令控制器中$attr.valueAtt
内的对象是“[object object]”
,我无法获取它:
我的代码:
var value = (
[{
functionLabel:'Fun',
functionTemplate: function(param1,param2){
alert(param1);
},
functionParams: ['PARAM1','PARAM2']
}]);
然后我将其作为指令元素的属性添加到控制器中:
angular.element(document.getElementById('space-for-modals'))
.append($compile("<modal-dialog visible='true' data-backdrop='static' valueAtt='"+value+"'></<modal-dialog>")($scope));
但是在
$scope.functions
中只有“[object]”。有没有办法将函数模板从一个控制器发送到另一个控制器,以便以后调用它?问题是,当您执行valueAtt='“+value+”
时,JavaScript会将value
转换为字符串,即“[对象]”
。您需要将对象存储在作用域中,然后在HTML属性中按名称引用它。大概是这样的:
var scope2 = scope.$new();
scope2.foo = [{
label:'Fun',
fn: function(param1, param2){
alert("Callback function says: " + param1)
},
params: ['PARAM1', 'PARAM2']
}];
angular.element(document.getElementById('space-for-modals'))
.append($compile("<modal-dialog visible='true' data-backdrop='static' value-att='foo'>Modal dialog</<modal-dialog>")(scope2));
在对话框控制器中,您可以访问函数
成员。请注意,在调用link函数之前,此功能不会准备就绪,因此您需要使用手表:
$scope.$watch('functions', function(functions) {
if (functions == null)
return;
var ft = functions[0];
ft.fn.apply(null, ft.params);
});
我必须说,像这样编译HTML有点奇怪——为什么不在指令声明中使用模板呢?如果这是因为你想把内容放在DOM的另一个级别,考虑使用A来与它通信(基本上,你在一个共享的单体对象上设置一个字段)。此外,您还可以使用,以避免自己绑定属性
服务可以存储由控制器触发的回调函数:
$scope.functions= $attrs.valueAtt;
.service('modalService', [function() {
var proxy = function(message) {
proxy.callback(message);
};
proxy.callback = function() {};
return proxy;
}])
如果将其同时注入到对话框和触发器控制器中,则可以在它们之间进行通信。模态对话框应使用自己的函数替换回调 Okej我怀疑这是转换问题,但实际上我无法将“value”存储在major$scope中的静态变量中,因为我想用它调用模态窗口,该窗口具有通用功能,依赖于存储在“value”中的函数。这就是我决定将“value”作为属性的原因。是否有其他选项可用于保存视图中的函数的“值”或直接将其提供给指令控制器 请在代码示例中添加空格/换行符/换行符好吗?实际演示如何在scope1上设置obj可能是个好主意。我是一个新的角度,所以可能我错了,但我想这里也有var scope2=scope.$new();是静态的,当我同时收到两个请求以显示来自一个scope2的模式窗口数据时。foo可能会被第二个请求所掩盖,或者我应该为每个模式窗口动态创建单独的scope3 scope4 scope等等?2.隔离作用域的想法看起来很有趣,但我可以像示例中那样动态创建控制器。控制器('NaomiController',['$scope',函数($scope)?还是必须硬编码?1。
scope2=scope。$new()
只是一个例子,因为我不知道您当前从何处获取范围。您可以随心所欲地执行此操作。由于对话框控制器正在监视该数组,如果您将其替换为另一个数组(例如,复制并向其添加项)然后对话框将被更新。2.好吧,它必须是硬编码的。但是你可以把你喜欢的任何东西放入范围中,比如上面所示的函数。我真的认为服务会更好。我将添加另一个演示。
.service('modalService', [function() {
var proxy = function(message) {
proxy.callback(message);
};
proxy.callback = function() {};
return proxy;
}])