我使用的是SilverStripe 3.0 CMS,我需要在CMS中加入Google地图。
我跟随this steps,除了它有点旧,official documentation在当前版本的SilverStripe中使用相同的方法(至少它似乎是当前版本文档)。
问题出在代码的这一部分:
Behaviour.register({
"#Form_EditForm" : {
initialize : function() {
this.observeMethod("PageLoaded", this.adminPageHandler);
this.adminPageHandler();
},
adminPageHandler : function() {
initialize();
}
}
});
首先,没有定义行为。我需要手动包含框架内的behaviour.js文件。但现在,我得到一个类型错误:
this.observeMethod is not a function
在SilverStripe CMS中打开页面编辑器时,有人可以给我一些关于如何调用javascript函数的提示吗?
答案 0 :(得分:6)
你提到的'Behaviour.register'调用肯定已弃用,核心代码中不再提供,因此文档需要更新。
不幸的是,我找不到有记录的方法来替换这种行为,但是现在根据您提到的第一手论坛帖子中的方法,以下内容应该对您有用:
找到此处添加的'initGoogleMaps.js'脚本:
function getCMSFields() {
Requirements::javascript('mysite/javascript/initGoogleMaps.js');
...
在此脚本中,删除Behaviour.register...
块,然后将initialize
函数移到文档.ready(或者只是删除document.ready部分),这样{{ 1}}是全局可用的(您可以考虑重命名)。
然后,在initialize
:
getCMSFields
这将确保每次在cms中呈现页面的“编辑视图”时调用$fields->addFieldToTab('Root.Content', new LiteralField('js', '<script>initialize();</script>'));
函数。
HTH
答案 1 :(得分:3)
正如ben所说,
LeftAndMain::require_javascript('mysite/javascript/initGoogleMaps.js')
比“在需要时包含它”更可靠。为什么? 由于Silverstripe使用Ajax,因此最好在第一次加载时加载任何javascript或css,以便在ajax驱动的环境中转到CMS内的不同模型管理区域时它们已准备就绪。在开始时不加载会导致不一致,并且当您不加载该管理区域时,将不会加载您的js,css文件。
来自文档:http://doc.silverstripe.org/framework/en/reference/requirements和http://api.silverstripe.org/3.0/class-LeftAndMain.html
整体“在你需要它时包括它”的东西显示出一些弱点 诸如CMS之类的区域,其中Ajax用于加载大块的 应用程序,可能需要更多的CSS和JavaScript 包括在内。 在此阶段,唯一的解决方法是确保这一点 您可能需要的所有内容都包含在首页加载中。
一个想法是提及应包含的CSS和JavaScript 在Ajax响应的标头中,以便客户端可以加载 完成Ajax请求后的那些脚本和样式表。 这可以很干净地编码,但为了获得最佳结果,我们想要 使用我们自己对Ajax系统的更改来扩展prototype.js,以便 每个脚本都对此持续支持。
顺便说一句,这行的理想位置是自定义模块中的_config.php或mysite,具体取决于您的需求。
答案 2 :(得分:0)
LeftAndMain::require_javascript('mysite/javascript/initGoogleMaps.js')
会更好用