【问题标题】:Compare 2 GET object from different controllers比较来自不同控制器的 2 个 GET 对象
【发布时间】:2015-09-10 08:45:16
【问题描述】:

我有来自 2 个不同控制器的 2 个(数组)对象。

对象 1(名称控制器 1):

[{id:1,"name":"jakov"},...]

对象 2(昵称控制器 2):

[{id:1, "nickname" : "jandric", "nameId" :1, "title" : "master"},...]

我通过服务从控制器 1 广播对象:

$http.get('names/').success(function(data) {
            sharedService.broadcastItem(data);
});

我在控制器 2 中处理广播对象:

$scope.$on('handleBroadcast', function() {
            $scope.names= sharedService.message;
});

控制器 2 也有 GET 请求:

$http.get('nicknames/').success(function (data) {
           $scope.nicknames = data;
});

我有一个简单的表格,我想在其中显示:nicknameId、nickname、name 和 title。

类似这样的:

<div ng-controller="Nickname">
    <table>
        <tr>
            <th>nicknameId</th>
            <th>nickname</th>
            <th>name</th>
            <th>title</th>
        </tr>
        <tr ng-repeat="nick in nicknames">
            <td>{{nick.id}}</td>
            <td>{{nick.nickname}}</td>
            <td ng-controller="Name">{{??????}}</td> //GET name request trigger
            <td>{{nick.title}}</td>
        </tr>
    </table>
</div>

对于给定的 nameId,如何在第二个对象中从第一个对象获取名称??

请帮助:D

更新

我设法在 html 中这样做:

    <div ng-controller="Nickname">
        <table>
            <tr>
                <th>nicknameId</th>
                <th>nickname</th>
                <th>name</th>
                <th>title</th>
            </tr>
            <tr ng-repeat="nick in nicknames">
                <td>{{nick.id}}</td>
                <td>{{nick.nickname}}</td>
                <td ng-controller="Name">
                   <div ng-repeat="name in names">
                      <div ng-if="nick.nameId === name.id">
                          {{name.name}}
                      </div>
                   </div>
                </td>
                <td>{{nick.title}}</td>
            </tr>
        </table>
    </div>

所以我在 for 循环中使用 for 循环。还有更简单的答案吗?

【问题讨论】:

  • 你为什么不重建所需的数组并放到$scope?昵称和名字之间有一对一的关系吗?
  • 同一个昵称可以附加多个名字

标签: javascript angularjs angularjs-service angularjs-controller angularjs-http


【解决方案1】:

试试这个

<div ng-controller="Nickname">
    <table>
        <tr>
            <th>nicknameId</th>
            <th>nickname</th>
            <th>name</th>
            <th>title</th>
        </tr>
        <tr ng-repeat="nick in nicknames">
            <td>{{nick.id}}</td>
            <td>{{nick.nickname}}</td>
            <td ng-controller="Name">
                <span ng-reapeat="n in names">
                <span ng-if="nick.nameId == n.id">{{n.name}}</span>
                </span>
            </td> //GET name request trigger
            <td>{{nick.title}}</td>
        </tr>
    </table>
</div>

【讨论】:

    【解决方案2】:

    我希望你的问题是正确的: 在 Nickname 控制器 $scope 中创建一个索引,该索引通过 id 映射到名称:

    /**
     *
     * @param {Array.<obj>} source: The array of objects the index should be created with.
     * @param {string} property: The property that shall be used as key for the new index
     * @return {object} provides access to all objects by the chosen property
     */
    var buildIndex = function(source, property) {
        var temp = {};
        for(var i = 0, len = source.length; i < len; ++i) {
            temp[source[i][property]] = source[i];
        }
        return temp;
    };
    

    然后就可以访问模板中的索引了:

    <div ng-controller="Nickname">
    <table>
        <tr>
            <th>nicknameId</th>
            <th>nickname</th>
            <th>name</th>
            <th>title</th>
        </tr>
        <tr ng-repeat="nick in nicknames">
            <td>{{nick.id}}</td>
            <td>{{nick.nickname}}</td>
            <td>{{index[nick.id].name}}</td>
            <td>{{nick.title}}</td>
        </tr>
    </table>
    

    【讨论】:

    • 是的,这是正确的,但即使在这种情况下,我也使用“ng-repeat”和for循环,那么其他答案有什么不同吗?我可以使用 nick.id 和循环昵称来查找昵称(同样的事情)
    • 这个解决方案有两点。 1.避免使用很慢的ng-if,在任何情况下都会构造DOM对象 2.代码可读性
    猜你喜欢
    • 2023-03-10
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多