如何让网络摄像头与 AngularJS 一起工作?

How do I get a webcam working with AngularJS?

以前我已经将工作网络摄像头代码放入我的应用程序中,但现在当我更新到 AngularJS v1.5.0 时它不工作了。我正在使用 webcam-directive,它与 v1.3.0 完美配合。

这是我的代码:

<webcam placeholder="selfiePlaceHolder"
  on-stream="onStream(stream)"
  on-access-denied="onError(err)" on-streaming="onSuccess(video)">
</webcam>

但现在 AngularJS v1.5.0 出现以下错误:

Uncaught Error: [$parse:isecdom] Referencing DOM nodes in Angular expressions is disallowed! Expression: onSuccess(video)
http://errors.angularjs.org/1.5.0/$parse/isecdom?p0=onSuccess(video)

我也尝试过对 AngularJS ng-Camera 使用不同的解决方案,但即使是它的演示页面也不适合我。

注意: 我知道问题是我们无法从较新版本的 AngularJS 访问 DOM,但相同的代码有效与旧版本。我需要知道如何将 "Video" DOM 对象传递给控制器​​。

当表达式尝试访问 DOM 节点时,通常会发生潜在错误,因为它被 AngularJS 通过表达式限制访问 DOM 节点,因为它可能会导致执行任意 Javascript 代码。

当 return 是 DOM 节点的事件处理程序时,$parse:isecdom error 与事件处理程序对函数的调用有关,如下所示:

<button ng-click="myFunction()">Click</button>
$scope.myFunction = function() {
  return DOM;
}

要解决此问题,请避免访问 DOM 节点并避免从事件处理程序中访问 returning DOM 节点。 (参考:https://docs.angularjs.org/error/$parse/isecdom)

添加显式 return 可能会解决此问题,详见此处:CoffeeScript - Referencing DOM nodes in Angular expressions is disallowed

根据 github page 上的示例,我能够使用上面评论中的频道建议使网络摄像头指令正常工作。

function MyController($scope) {
    $scope.myChannel = {
        // the fields below are all optional
        videoHeight: 800,
        videoWidth: 600,
        video: null // Will reference the video element on success
    };
}

onSuccess(on-streaming attr)和onStream(on-stream attr)回调video 属性 of myChannel 填充了视频 DOM 元素(然后它显然也可用于控制器中的所有其他内容)。不过,根据示例代码中的注释,您应该至少等到 onSuccess 才能访问它。 Here is a working example

我找到了问题的解决方案。需要做两件事:

第一个 HTML:

<webcam channel="channel" 
        on-streaming="onSuccess()" 
        on-error="onError(err)" 
        on-stream="onStream(stream)"></webcam>

其次,在控制器中,您可以使用以下代码访问DOM视频:

 $scope.onSuccess = function () {
        // The video element contains the captured camera data
        _video = $scope.channel.video;
        $scope.$apply(function() {
            $scope.patOpts.w = _video.width;
            $scope.patOpts.h = _video.height;
            //$scope.showDemos = true;
        });
    };

这是一个有效的 example