【问题标题】:AngularJS Directives for Chrome App and Android 'webview' TagsChrome 应用程序和 Android 'webview' 标签的 AngularJS 指令
【发布时间】:2016-06-27 18:39:41
【问题描述】:

我正在将现有的 Chrome 打包应用更改为使用 Angular。到目前为止它运行良好,但我不确定如何从 Angular 外部更新 UI,例如响应 Chrome 事件。

例如,我有一个 webview,其当前地址通过 loadCommit 进行监控。这里只是简化的代码:

HTML 片段:

<p>Current url = {{url}}</p>

控制器:

app.controller('MainController', function($scope) {
    // This is the inital url
    // It shows up in the HTML fragment
    $scope.url = "http://stackoverflow.com";
});

事件监听器:

webview.addEventListener('loadcommit', function() {
  url = webview.src;
  //How to update Angular framework with current value of url?
}

如何访问控制器的 url 变量,以便 UI 反映更改?简单地引用控制器中的全局变量是行不通的,比如:

$scope.url = url;

【问题讨论】:

    标签: angularjs angularjs-directive google-chrome-app


    【解决方案1】:

    使用$apply

    来自文档:

    $apply([exp]);

    $apply() 用于从 Angular 框架外部执行 Angular 表达式。 (例如来自浏览器 DOM 事件、setTimeout、XHR 或第三方库)。因为我们正在调用 Angular 框架,所以我们需要执行 exception handlingexecuting watches 的正确范围生命周期。

    -- AngularJS $rootScope API Reference -- $apply


    更新

    应使用 AngularJS 指令将 AngularJS 功能添加到 webview 标签。

    HTML

    <div ng-controller="MainController">
        <webview current-src="url" id="foo" 
                 src="http://stackoverflow.com/"
                 style="width:640px; height:480px">
        </webview>
    
        <p>Current url = {{url}}</p>
    </div>
    

    指令

    app.directive("webview",function() {
        return {
            restrict: "E",
            link: function(scope,elem,attrs) {
                var webview=elem[0];
                elem.on("loadcommit", function(e) {
                    $scope.$apply(attrs.currentSrc +'='+ webview.src);
                });
            }
        };
    });
    

    示例指令添加了一个loadcommit 侦听器,它将current-src 属性定义的范围变量设置为webview 标记的src 属性的值。

    【讨论】:

    • 谢谢!这是一个很好的解决方案。坦率地说,我什至不知道您可以在现有的 HTML 标记(例如 webview)上设置指令。我看到的所有示例都是将自定义标签定义为 。 $apply 本质上是否像 eval() 一样工作,并添加了一些 Angular 内部维护?
    • $apply() 是一个作用域对象的方法,并在该作用域的上下文中评估 Angular 表达式。有关 Angular 表达式的更多信息,请参阅AngularJS Developer Guide - Expressions。在对表达式求值后,$apply 调用一个摘要循环,然后更新 DOM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多