【发布时间】:2015-10-14 10:56:10
【问题描述】:
达到了我的 Angular 知识的上限,我一直在这个问题上兜圈子。
基本上我有视频播放器和章节列表指令,每个指令都有一个控制器。控制器使用相同的模型服务,如下所示:
.service('VideoPlayerModel', function(){
var model = this;
model.chapters = {
chapterPos: 0,
targetChapter:null,
data: []
},
model.getVideoData = function() {
return model.videoData;
};
model.setVideoData = function(vData){
...
...
...
};
});
在视频播放器控制器中,随着播放器时间的更新,它会找到所需的章节数据并更新 model.chapters 数据,如下所示:
updateChapter: function(currentTime){
var chapters = VideoPlayerModel.chapters;
var chaptersCtrl = videoPlayerCtrl.chapters;
if (chapters.nextChapter.start <= currentTime) {
chapters.chapterPos = chapters.chapterPos + 1;
chaptersCtrl.setChapter(); //This finds and sets the Target Chapter
}
},
setChapter 运行后,我调用 console.log(VideoPlayerModel.chapters),我可以看到数据模型已更新,结果如下:
Object {chapterPos: 1, targetChapter: Object, data: Array[6], nextChapter: Object}
但是,ChapterListCtrl 中的手表不会触发,并且任何显示 ChapterPos 的屏幕项目仍然只显示初始值 0。
控制器如下所示:
.controller("ChapterListCtrl", ['$scope', 'VideoPlayerModel', function($scope, VideoPlayerModel) {
$scope.chapters = VideoPlayerModel.chapters;
$scope.$watch(function() { return VideoPlayerModel.chapters; }, function(newValue, oldValue){
$scope.chapters = newValue;
console.log("A Change"); // Only runs at initialisation.
});
}])
我尝试了不同的方法并以这种方式结束,不确定我现在是否走错了方向。有人可以帮忙吗?
【问题讨论】:
-
您可以使用 broadcast() 方法更新所有控制器。
-
当我尝试像在
$rootScope.$broadcast('scanner-started');中那样使用$rootScope 时,我得到相同的Uncaught ReferenceError: $rootScope is not defined错误。我正在使用 Angular 1.4,我是否必须做一些特别的事情才能获得根范围,我似乎永远无法访问它。 -
是的,您需要将
$rootScope注入到您的服务定义中。我将此代码添加到下面的答案中。
标签: javascript angularjs models controllers