从swift调用角度函数

时间:2016-07-29 18:40:55

标签: javascript angularjs swift

我试图将值从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:undefined不是对象(评估&#39; angular.element(document.getElementById(&#39; trackingToggle&#39;))。scope()。setTracking&#39;)

似乎document.getElementById(&#39; trackingToggle&#39;)不可用,但我可以在Safari网络检查器元素标签中看到以下内容

<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传递到角度控制器吗?

更新 角度应用程序正在使用UI路由,并根据路由加载来自不同模板的页面内容。我后来发现函数setTrackingToggleToTrue()在加载模板之前被调用,因此在函数调用时没有可用的trackingToggle。是否有另一种方法可以在控制器外调用角度函数而不引用任何文档元素?

感谢。

2 个答案:

答案 0 :(得分:1)

事实证明,WKWebView.evaluateJavaScript()只能在顶级作用域上调用javascript。被调用的顶级作用域javascript不能使用angular.element()来调用角度控制器函数,该函数基于从基于路由的模板加载的元素。

我最终使用一种尴尬的方式来解决它。顶级作用域java脚本在本地存储中设置切换按钮值,角度控制器函数将检查值,直到它可用。我还必须手动使用$ scope。$ apply()来反映UI的变化。

同样可以通过promise实现。我稍后会尝试承诺。

答案 1 :(得分:0)

请在这里找到工作小提琴:http://jsfiddle.net/varit05/06Ldnys8/25/

控制器:

var app = angular.module('app', []).controller('ctrl', function($scope) {
  $scope.inside = { 'name': 'guy', 'idk': 'blah' };
  $scope.abc = function(value) {
    console.log(value);
  }
});

var getStuff= function() {
  var outside = angular.element(document.getElementById('stuff')).scope().abc('called');
 //console.log(outside.inside)
}

HTML:

<div ng-app="app" ng-controller="ctrl" id="stuff">
</div>

<button onclick="getStuff()">get stuff</button>

希望它可以帮到你!

干杯!