我正在尝试将值从swift传递给angularJS。以下是调用javascript函数的快速代码:
let userScriptSetToTrue = WKUserScript(
source: "setTrackingToggleToTrue();",
injectionTime: WKUserScriptInjectionTime.AtDocumentEnd,
forMainFrameOnly: true
)
contentController.addUserScript(userScriptSetToTrue)
...
let js = "setTrackingToggleToTrue();"
self.webView?.evaluateJavaScript(js) {
(_, error) in print(error)
}
然后,JavaScript调用角度控制器功能:
<script>
function setTrackingToggleToTrue() {
angular.element(document.getElementById('trackingToggle')).scope().setTracking(true);
}
</script>
但是我在javascript端遇到了以下错误:
TypeError:未定义不是对象(评估'angular.element(document.getElementById('trackingToggle'))。scope()。setTracking')
似乎document.getElementById('trackingToggle')不可用,但我可以在Safari Web检查器元素选项卡中看到以下内容
<div class="list-group-item">
<tracking-toggle-button
id="trackingToggle"
state="trackingEnabled"
class="pull-right"
on-toggle="updateTrackingPreference(newState);">
</tracking-toggle-button>
<label class="tracking-label">My Location</label>
</div>
发生此错误的原因是什么?还是有更好的方法将值从swift一直传递到角度控制器?
更新angular应用程序正在使用UI路由,并基于路由从不同的模板加载页面内容。稍后,我发现函数setTrackingToggleToTrue()在加载其模板之前已被调用,因此在函数调用时没有trackingToggle可用。有没有其他方法可以在不引用任何文档元素的情况下在控制器外部调用角度函数?
谢谢。
事实证明WKWebView.evaluateJavaScript()只能在顶级范围内调用javascript。所调用的顶级范围javascript无法基于基于路由从模板加载的元素,使用angular.element()来调用角度控制器功能。
我最终使用了一个笨拙的方法来解决它。范围最广的Java脚本在本地存储中设置了切换按钮的值,角度控制器功能将检查该值,直到可用为止。我还必须手动使用$ scope。$ apply()来反映UI中的更改。
通过诺言也可以达到同样的目的。稍后我将尝试诺言方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句