AngularJS:更新ng-repeat中的范围

时间:2015-03-13 19:00:26

标签: javascript angularjs angularjs-scope angularjs-ng-repeat

我有一个带有几个嵌套控制器和视图的Angular应用程序。我根据本教程为ngInfiniteScrolling密切实现了无限滚动:http://binarymuse.github.io/ngInfiniteScroll/demo_async.html

所以我有一个服务,可以将项目加载到$scope.content.items的数组中。然后有一个显示每个结果的ng-repeat元素。

$scope.content = new Content()
$scope.content.loadMore( $scope.currentStream, 2 ) // this part is actually called in the HTML, but while debugging I've just done it in the controller

现在我想实现搜索,而不是创建另一个搜索页面,只需加载项目代替当前项目列表。基本上取代$scope.content.items

所以我构建了一个相同的控制器,但现在调用我的搜索API。我使用ng-change查看是否有人在搜索框中输入,然后在调用的函数中执行

$scope.search = function() {
    $scope.content = new Search()
    $scope.content.load( $scope.query )
}

我可以在控制台中看到它可以在浏览器控制台中替换$scope.content.items

var scope = angular.element($('[ng-controller=HomeController]')).scope()
scope.content.items

这显示了我在每种情况下所期望的对象数组(在触发ng-change="search()"之前或之后)。但页面本身不会更新。它只显示来自Content()服务的内容。

同样,如果我将以下两行替换为我的控制器,它会显示来自Search()服务的内容:

$scope.content = new Search()
$scope.content.load( 'thom' )

长话短说,我觉得服务和API工作正常,但当我更改$scope.content.items使用的ng-repeat数组时页面没有更新。


这是HTML

<div class="panel panel-item" ng-repeat="item in content.items" ng-hide="hideItem">
    <h2 ng-hide=" item.stream == 'read' " data-ng-bind="item.title"></h2>

    <a ng-click="openReaderModal( item )" class="cursor-pointer" ng-show=" item.stream == 'read' ">
        <h2 data-ng-bind="item.title"></h2>
    </a>

    // ...

    <div class="clearfix"></div>
</div>

2 个答案:

答案 0 :(得分:0)

以某种方式修正了它。以下是app.config() 之前的路线

$stateProvider
    // ...
    .state( 'app', {
        url: '/app',
        templateUrl: 'app/views/app.html',
        controller: 'HomeController'
    })
    .state( 'app.home', {
        url: '/main',
        templateUrl: 'app/views/home.html',
        controller: 'HomeController'
    })
    .state( 'app.profile', {
        url: '/profile',
        templateUrl: 'app/views/profile.html',
        controller: 'ProfileController'
    })
    .state( 'app.read', {
        url: '/read',
        templateUrl: 'app/views/stream-content.html',
        controller: 'HomeController'
    })
    .state( 'app.watch', {
        url: '/watch',
        templateUrl: 'app/views/stream-content.html',
        controller: 'HomeController'
    })
    .state( 'app.listen', {
        url: '/listen',
        templateUrl: 'app/views/stream-content.html',
        controller: 'HomeController'
    })

此后

$stateProvider
    // ...
    .state( 'app', {
        url: '/app',
        templateUrl: 'app/views/app.html',
        controller: 'HomeController'
    })
    .state( 'app.home', {
        url: '/main',
        templateUrl: 'app/views/home.html'
    })
    .state( 'app.profile', {
        url: '/profile',
        templateUrl: 'app/views/profile.html',
        controller: 'ProfileController'
    })
    .state( 'app.read', {
        url: '/read',
        templateUrl: 'app/views/stream-content.html'
    })
    .state( 'app.watch', {
        url: '/watch',
        templateUrl: 'app/views/stream-content.html'
    })
    .state( 'app.listen', {
        url: '/listen',
        templateUrl: 'app/views/stream-content.html'
    })

它有效。如果有人可以提供解释,我会将答案归功于他们。

答案 1 :(得分:0)

角度中的路由就像这样。

当我们为$ stateProvider提供一个控制器时,它实际上被认为是一个新的构造函数(如java中的新关键字),因此数据被重新启动为默认值。 新的构造函数将是自己的子节点,访问父控制器可以使用$ parent