角度搜索过滤器不起作用(PHP返回的数据)

时间:2014-01-19 19:20:49

标签: php json angularjs

我没有让搜索过滤器正常工作。

项目模板:

<h3>Projekte</h3>
Search: <input ng-model="searchText">
<table class="table">
    <thead>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Long Title</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="(key, project) in projects | filter:searchText">
            <td>{{key}}</td>
            <td>{{project.title}}</td>
            <td>{{project.longTitle}}</td>
            <td><button class="btn btn-default" ng-click="edit()"><i class="fa fa-pencil"></i></button></td>
        </tr>
    </tbody>
</table>

控制器:

var secProjects = function ($http,$scope, $modal) {

    $http.post('php/data.php').
    success(function(data) {
        $scope.projects = data;
    })

}

PHP:

while($row = mysql_fetch_object($result)){
        $data[$row->ID] = array ('id'=>$row->ID,'title'=>$row->Title,'longTitle'=>$row->TitleLong, 'textDE'=>$row->DescriptionDE,'start'=>$row->DateStart,'end'=>$row->DateEnd);
    }
    echo json_encode($data);

我希望你能帮助我:(我认为原因在于我在我的范围内得到数据的方式。但我不确定。

编辑:更改PHP解决了问题:

   $data = array();
   while($row = mysql_fetch_object($result)){
      array_push($data,['id'=>$row->ID,'title'=>$row->Title,'longTitle'=>$row->TitleLong]);
   }
   echo json_encode($data);

2 个答案:

答案 0 :(得分:1)

问题是你的后端将数据作为对象而不是数组返回 但filter仅适用于数组(根据 the docs ):

  

从数组中选择项目的子集并将其作为新数组返回。


所以,你有两个选择:

<强> 1
在将数据分配给作用域之前,将它们从对象转换为数组。 E.g:

$http.post(...).success(function (data) {
    $scope.projects = [];
    for (var key in data) {
        $scope.projects.push(data[key]);
    }
});

<强> 2
让你的后端将数据作为JSONified数组而不是对象返回 PHP将$data“数组”解释为对象的原因是索引不是顺序的(从0开始)。即而不是索引0, 1, 2...,你有1,2,3...。 (有关详细信息,请参阅 this answer 。)
要解决此问题,您可以更改代码,如下所示:

$data[] = array (...

另请参阅此 short demo

答案 1 :(得分:0)

我在没有服务电话here的情况下重复了您的工作。除了你的帖子(应该是一个获得),它完全相同。它工作正常。花一些时间来检查你的工作。 Javascript错误可能会禁用其他功能。

    $scope.projects = [{
    title: 'one',
    longTitle: 'one long title'
}, {
    title: 'two',
    longTitle: 'two long title'
}];