【问题标题】:Call AngularJs controller function from Java android从 Java android 调用 AngularJs 控制器函数
【发布时间】:2014-07-20 13:02:30
【问题描述】:

我正在尝试从我的 java 代码中调用控制器范围内的函数。 在 Google 中进行大量搜索后,我发现这段代码可以从 Java 代码中调用 Js 函数,但我无法直接调用我的控制器函数。

myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(jsInterface, "JSInterface"); 
myWebView.loadUrl("javascript:"+functionName);

终于可以从 Java 调用 Js 函数了。现在我想从不在控制器中的其他函数调用我的控制器函数。我尝试使用下面的代码从外部调用 AngulrJs 控制器功能。

var scope = angular.element(document.getElementById("messageList")).scope();
    scope.$apply(function(){
        scope.number = '345';
        scope.message = 'Shan';
        scope.addItem();
    })

但是这段代码导致下面的错误

Uncaught TypeError: Cannot read property '$apply' of undefined 

我尝试了 $apply 和 safeApply,但都不起作用。我是 AngularJs 的新手,任何建议都会对我有所帮助。

HTML 代码:

<div id="mainContainer" ng-controller="MainCtrl">
      <ion-nav-view></ion-nav-view>
</div>

<script id="message.html" type="text/ng-template">
      <ion-view title="Message">        
        <ion-content>
        <div id="messageList" ng-controller="MessageCtrl">
          <ion-list>
            <ion-item ng-repeat="item in items">
               {{item.number}} - {{item.message}}!
            </ion-item>
          </ion-list>
          </div>
        </ion-content>
      </ion-view>
    </script>

【问题讨论】:

  • 向后工作一点,document.getElementById("messageList") 定义了吗?
  • 其实messageList是模板的一部分。
  • 当你调用你的代码时不回答是否定义了?

标签: javascript android angularjs controller scope


【解决方案1】:

你不能在你的作用域变量上调用 $apply,你可以这样做:

var scope = angular.element(document.getElementById("messageList")).scope().addItem();

这是您访问函数的方式。

【讨论】:

  • 感谢您的回复..但它不起作用,Uncaught TypeError: Cannot read property 'addItem' of undefined
  • 也许那部分没有问题。您能否发布更多详细信息或 UI 方面的代码
  • 代码:&lt;div id="mainContainer" ng-controller="MainCtrl"&gt; &lt;ion-nav-view&gt;&lt;/ion-nav-view&gt; &lt;/div&gt; &lt;script id="message.html" type="text/ng-template"&gt; &lt;ion-view title="Message"&gt; &lt;ion-content&gt; &lt;div id="messageList" ng-controller="MessageCtrl"&gt; &lt;ion-list&gt; &lt;ion-item ng-repeat="item in items"&gt; {{item.number}} - {{item.message}}! &lt;/ion-item&gt; &lt;/ion-list&gt; &lt;/div&gt; &lt;/ion-content&gt; &lt;/ion-view&gt; &lt;/script&gt;
  • 我认为目标部分尚未加载。实际上我正在尝试更新仅在模板中而不在视图中可用的控制器。听起来很傻的问题,是否可以不通过 DOM 元素直接访问控制器?
  • 目前我正在尝试按元素获取控制器范围。但是元素不在视图中,它是模板的一部分。所以我只想通过Controller名称访问控制器功能,可以吗?
【解决方案2】:

如果您在调用时没有及时加载目标视图 非角函数,你的控制器也不会被加载,所以一个 解决方案是有一个隐藏元素 "ng-controller='yourMagicController"' 你总能得到 功能。另一种方法是使用 $injector。 – HelloWorld 7 月 20 日在 22:59

这种方法解决了我的问题。。谢谢

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多