Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于另一个控制器的ng repeat属性更新一个控制器中的ng repeat属性?_Javascript_Html_Angularjs - Fatal编程技术网

Javascript 基于另一个控制器的ng repeat属性更新一个控制器中的ng repeat属性?

Javascript 基于另一个控制器的ng repeat属性更新一个控制器中的ng repeat属性?,javascript,html,angularjs,Javascript,Html,Angularjs,我有两个独立的角度控制器,一个在主内容区(homeCtrl)中显示事件列表,另一个在侧栏(sidebarCtrl)中显示事件标记列表 // homeCtrl.js $scope.events = [{ name: "Example Event Name", tags: [ { "id":7, "name":"Imaginon", "following": "false" }, ] }]; 在侧栏控制器中,我收集了最常用的

我有两个独立的角度控制器,一个在主内容区(
homeCtrl
)中显示事件列表,另一个在侧栏(
sidebarCtrl
)中显示事件标记列表

// homeCtrl.js
$scope.events = [{
  name: "Example Event Name",
  tags: [
    {  
       "id":7,
       "name":"Imaginon",
       "following": "false"
    },
  ]
}];
在侧栏控制器中,我收集了最常用的标记:

// sidebarCtrl.js
$scope.tags = [  
  {  
     "id":17,
     "name":"MintMuseum",
     "following": "true"
  },
  {  
     "id":7,
     "name":"Imaginon",
     "following": "false"
  }];
我希望这样,如果用户开始跟踪侧栏中的标记,该标记将在侧栏和主提要中高亮显示。如果我们只是想在侧栏中突出显示它,那就很容易了:

// sidebar.html
<div ng-repeat="tag in tags"> 
  <li ng-class="{highlighted: tag.following}" ng-click="followTag(tag)">{{ tag.name }}
</div>
//sidebar.html
  • {{{tag.name}
  • 但我不知道如何在home提要中突出显示该标记颜色的所有实例。在jQuery中,只需为文档中的每个标记实例提供一个
    tag_17
    (或者该标记碰巧是什么ID)就非常容易了,但最好避免使用jQuery,如果可能的话,使用Angular的数据绑定范例


    有什么建议吗

    创建一个名为highlightService的服务,例如:

    myModule.factory('highlightService', function() {
    
       var highlighted = [];
    
       var toggleHighlight = function(tag) {
          var index = highlighted.indexOf(tag);
          if(index > -1) {
             highlighted.splice(index, 1);
          }
          else{
             highlighted.push(tag);
          }
       }
    
        return {
            highlighted: highlighted,
            highlight: highlight
        }
    });
    
    将服务注入控制器,然后为其分配一个局部范围变量:

    $scope.highlightService = highlightService;
    
    然后在html中:

    <div ng-repeat="tags in highlightService.highlighted">
       <div ng-click="highlightService.highlight(tag)></div>
    </div>
    

    根据需要在HTML中同时使用服务和筛选器。

    您想创建一个服务来保存控制器之间的数据。或者,如果值发生变化,您还需要$watch来监视它们。但是,考虑到这两个控制器的总体数据类型如此不同(即
    homeCtrl.js
    上的事件中的标记是其父事件对象的嵌套对象),我如何关联这两个控制器之间的标记呢这可能/可行吗?谢谢塔希斯的帮助。我可以看到,当在侧边栏中单击标记时,这将如何用东西填充我们的工厂。然而,我没有看到homeCtrl是如何意识到这一点的。在我上面的代码中,两个控制器的数据来自两个独立的数据库查询,因此不是相同的Javascript对象。它们的相似性在==方面,而不是在===方面。你可以创建一个数组来跟踪突出显示的标记的ID,然后使用ng repeat进行筛选或函数调用。我已经编辑了我的答案,使其具有一个过滤器和服务,在与ID数组匹配后返回相同的标记。哇。我只使用Angular几个月,但我意识到它有多强大。谢谢你的帮助@Tahsis。
    myApp.controller('highlightService', [function() {
        var highlightedIDs = [];
    
        var isHighlighted = function(tag) {
            if(var index = highlightedIDs.indexOf(tag.id) > -1) {
                return index;
            }
            else {
                return false;
            }
        }
    
        var highlight = function(tag) {
            var index = isHighlighted(tag.id);
            if(index) {
                highlightedIDs.splice(index, 1);
            }
            else {
                highlightedIDs.push(tag.id);
            }
        }
    
        return {
            isHighlighted: isHighlighted,
            highlight: hilight
        }
    }]).filter('highlighted', ['highlightService', function(highlightService) {
        return function(input) {
            if(highlightService.isHighlighted(input) {
                return input;
            }
            else {
                return false;
            }
        };
    }]);