3

まず、混乱させて申し訳ありませんが、私はこの問題を一晩中解決しており、何十もの SO の質問と AngularJS の記事を読んでいるので、どこに問題があるのか​​ を知っているかどうかさえわかりません:)

私は ng-app を持っています。コントローラーで のいくつかのプロパティのデフォルト データを定義すると$scope、このデータが後でプログラムによって変更されると、ビューの更新が停止します。

これが私のコードの短い例です:

...
config(['$routeProvider', function($routeProvider) {
$routeProvider.
    when('/abc/:letter', {templateUrl: template, controller: FilterCtrl}).
    otherwise({redirectTo: '/abc/a'});
}])
...

コントローラ:

function FilterCtrl($scope, $http, $routeParams) {

    $scope.mainfilter = $routeParams.letter;
    $scope.listItems = $http.post($scope.url, {'filterType': 'abc', 'letter': $routeParams.letter});

    $scope.searchTitle = function(search) {
        $scope.mainfilter = 'Film: ';
        //just test code to see if the data changes, will be other http call actually
        $scope.listItems = $http.post($scope.url, {'filterType': 'abc', 'letter': 'n'});
    }
}

ビューが定義されているメインのマークアップ (Symfony2、twig ロジック pls を無視):

    ...
    <div class="sort cell-1022 transparent-gray-back overflow-fix">

        <span class="sort--title">Search by</span>

        <select class="sort--selected chzn-select" ng-model="searchtitle" ng-change="searchTitle(searchtitle)">
            <option value="">film title</option>
            {% for id,title in titles %}
                <option value="{{ id }}">{{ title }}</option>
            {% endfor %}
        </select>

    </div>

</div>

<div class="divider transparent"></div>

<article class="wrapper">
    <div class="transparent-gray-back" ng-view>


    </div>

</article>

テンプレートの重要な部分:

<div class="scroll-list nice-scrollbars" >

    <span class="heading">{{ mainfilter.toUpperCase() }}</span>
    <ul class="item-list">
        <li ng-repeat="item in listItems.data | orderBy:order | filter:filter">
            <a ng-click="getRelated(item._id)">{{ item.title }}</a>
        </li>
    </ul>

</div>

主な問題は、コントローラの最初の 2 行がある場合、データはルート パラメータに応じて正しく初期化されますが、実行後にsearchTitle()更新されないことです。最初の 2 行を削除すると、ルートによって定義されたデータは (明らかに) プルされませんが、メソッドはフィールドと繰り返されるs のsearchTitle()両方を正しく入力します。mainfilter<li> 私は絶望的です。スコープに何か問題があることを示唆していますが、現在、情報が過負荷になっているため、助けていただければ幸いです。

4

2 に答える 2

1

コントローラーの初期「状態」/デフォルトを関数にラップし、$viewContentLoadedイベント時に呼び出すと役立ちました。これが私の修正です:

$scope.$on('$viewContentLoaded', $scope.init);

$scope.init = function() {
    $scope.mainfilter = $routeParams.letter;
    $scope.listItems = $http.post($scope.url, {'filterType': 'abc', 'letter': $routeParams.letter});
}

コントローラーコードで値を割り当てることによってのみデフォルトデータが設定された場合、ビューがこのデータに「スタック」する原因となった理由がまだわかりません。 .

于 2012-12-29T21:46:42.847 に答える
0

以下をお試しいただけますか?

$http.post の使用方法を変更します (両方の場所で)。次のように使用してみてください。

$http.post($scope.url, {'filterType': 'abc', 'letter': $routeParams.letter}).success(function(data) {
   $scope.listItems = data;
});

これは、ng-repeat がわずかに変化することを意味します。

ng-repeat="item in listItems"
于 2012-12-28T21:29:29.590 に答える