这无疑是一个愚蠢的问题,我只是在做一些简单的错误。
我有一个包含多个指令的页面,加载他们的模板和控制器。所有这些工作都很好,除了这个。
将控制器用作模型,this.
与$scope.
相同。所以在我的控制器中我有:
var self = this;
this.states = { showControls: false, showVideo: false }
this.showVideo = function() { self.states.showVideo = true; }
this.showControls = function() { self.states.showControls = true; }
$scope.$on(Constants.EVENT.START_WEBCAM, self.showVideo)
$scope.$on(Constants.EVENT.VIDEO_SUCCESS, self.showControls)
在视图中,我有一个按钮,可以显示视图的这一部分,然后请求访问您的网络摄像头。单击该按钮可从父控制器广播带有$rootScope.$broadcast
的事件。
当用户授予对网络摄像头的访问权限(在指令的链接功能中处理)时,它会以相同的方式广播另一个事件。
通过使用$scope.$on
进行侦听来触发这两种方法,并且两种方法都应该按照它们的方式触发。但是,showVideo方法成功更新其关联的状态属性,而showControls方法则不会。我做错了什么?
使用调试工具看起来,如states.showControls
被设置为true,但此更改未反映在视图中,并且向状态对象添加观察者不会此时检测到任何变化。我设置showVideo
时会这样做。
修改 这部分在指令中:
if (Modernizr && Modernizr.prefixed('getUserMedia', navigator)) {
userMedia = Modernizr.prefixed('getUserMedia', navigator);
}
var videoSuccess = function(stream) {
// Do some stuff
$rootScope.$broadcast(Constants.EVENT.VIDEO_SUCCESS);
}
scope.$on(Constants.EVENT.START_WEBCAM, function() {
if (MediaStreamTrack && MediaStreamTrack.getSources) {
MediaStreamTrack.getSources(function(sourceInfo) {
var audio = null;
var video = null;
_.each(sourceInfo, function(info, i) {
if (info.kind === "audio") {
audio = info.id;
} else if (info.kind === "video") {
video = info.id;
} else {
console.log("random unknown source: ", info);
}
});
if (userMedia) { userMedia(getReqs(), videoSuccess, error); }
});
}
});