【问题标题】:directive not updating on watch (or watchCollection)指令未在手表(或 watchCollection)上更新
【发布时间】:2014-07-02 00:07:22
【问题描述】:

我试图有一个指令,当集合收到更新时更新,但似乎无法触发监视事件(或$watchCollection)。

在我的工厂里,我有一个收藏

var streams = {
     "main":{ stream: streamDetails},
     "guest":{ stream: streamDetails}
}

我通过

将其包含在我的控制器中
.controller('vidCtrl', function($scope, vidFactory){
     $scope.streams = vidFactory.streams;
});

在我的html中,我有

<stream data-name="main"></stream>
<stream data-name="guest"></stream>
<stream data-name="other"></stream>

管理视频的指令是

app.directive('stream', function(){
       return {
             restrict: 'E',
             template: '<video></video>',
             scope:{
               name: '='
             },
             link: function(scope, element, attr){
              if(!scope.streams[scope.name]) return console.log('video not ready');
              var vid = scope.streams[scope.name];
               var video = element.find('video');
               video.attr('src', vid.stream);
               video[0].play();
             }
       }
});

我要做的是将other 流添加到$scope.streams,然后让它显示在正确的标签中。

我希望在我的指令中添加

scope.$watchCollection('videos', function(){
      //update stream somehow
});

但不幸的是,当我向视频对象添加新视频时,$watchCollection 没有被触发。

我正在通过以下函数添加到vidFactory.videos,我可以验证它是否正确更新了集合。当然,在工厂里,我不能使用$scope.$apply(),如果我把.on方法放在控制器中,它会触发多次,因为控制器包含在几个不同的角度指令中。

qc.on('video:added', function(stream){
    streams[stream.name] = stream;
});

我也尝试通过 $watchCollection 观看特定的流

if(!scope.streams[scope.name]){
 scope.streams[scope.name]=null;
 scope.$watch(scope.streams[scope.name], function(){
   //add video to stream method would go here
 }, true);

我认为使用手表比$watchCollection 更受欢迎,但我不明白为什么我的控制器没有触发$watch

【问题讨论】:

  • 尝试创建jsfiddle.net
  • scope.videos 在哪里初始化?
  • @Jerrad,scope.videos 是在控制器中初始化的,不好意思,我这里叫 scope.streams。我会更新的。

标签: javascript angularjs


【解决方案1】:

您正在尝试访问scope.streams,就好像它是在您的指令范围内定义的一样。

但是,由于您的指令使用隔离作用域,它不会从其父作用域继承 streams

你可以像这样将它传递给指令:

<stream data-streams="streams" data-name="other"></stream>

app.directive('stream', function () {
    return {
        restrict: 'E',
        template: '<video></video>',
        scope: {
            streams: '=',
            name: '@'
        },
        ...

另请参阅此short demo

【讨论】:

  • 我最初以为你在做一些事情@ExpertSystem,你很可能是,但是当在指令范围内包含流时,我得到一个不可分配的表达式错误docs.angularjs.org/error/$compile/nonassign
  • 你确定你使用了我的代码吗?你可以准备一个小提琴或 plunkr 吗?
  • 这是一个 jsfiddle。当我单击“添加流”时,它会将“其他”流添加到流对象,但不会更新指令。 $apply 给了我一个摘要错误。不知道为什么我现在没有收到 noassign 错误。
  • 关于 jsFiddle:您可以 1. 在浏览器的历史记录中查找最近访问过的页面或关闭的选项卡。 2.在jsFiddle上创建一个帐户,这样你就不会丢失你的小提琴:)
  • @pedalpete:我更新了小提琴并将其添加到我的答案中以供参考。 $watchCollection 不起作用的原因当然是您从未指定 $watchCollection...
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2013-05-08
  • 2014-08-23
  • 2016-06-22
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多