角度流星正确加载关系

时间:2015-07-06 13:52:51

标签: angularjs meteor relationship angular-meteor

我正在尝试在Angular-meteor上创建两个集合之间的关系。

areas - top in the structure
city - belongs to an area

在此post上,它使用Iron Router在加载控制器之前连接字段。这似乎是一个很好的解决方案,因为如果2个城市属于同一地区,它不会带来不止一次的区域。 如何使用angular的路由器进行两者之间的映射?

我已经尝试了publish-composite但似乎每个城市都会对其区域进行查询。

是否有更多Angularish的做法?

1 个答案:

答案 0 :(得分:2)

我做的是:

  • 创建了一个包含城市和地区的发布。区域仅通过城市过滤'领域
  • 在我的控制器上,我订阅了这个发布者并获得了两个收藏品
  • 创建了一个过滤器,用于在屏幕上打印信息,该信息将与city区域数组中的区域ID匹配,并返回其名称。

代码类似于:

// server side
Meteor.publish('citiesAndAreas', function(args) {
var cities = Cities.find({}, args);

// then extract those areas ids
var areaIds = cities.map(function(p) { return p.area_id });

// then return an array containing both the cities, and their corresponding areas
    return [
        cities,
        Areas.find({_id: {$in: areaIds}})
    ];
});

//client controller
$scope.modelItems = $meteor.collection(Cities).subscribe('citiesAndAreas');
$scope.areas = $meteor.collection(Areas);

// filter
angular.module("XXXX").filter('areaCity', function () {
    return function (area, city) {
        if (!city)
            return '';
        var name =  _.findWhere(area, {_id: city.area_id});
        if (name) {
            return name.title;
        } else {
            return '';
        }
    }
});

// on the html
<md-list-item ng-repeat="item in modelItems">
                {{item.title}}<br/>
                {{areas | areaProfession:item}}
                <md-button ng-click="remove(item)" aria-label="remove"><md-icon md-svg-icon="content:ic_clear_24px"></md-icon></md-button>
</md-list-item>