将 facebook 页面列表更新为下拉列表

Update facebook page list in to a drop down list

我正在开发一个与 Facebook 集成的 angular 应用程序。我已经给出了下面的代码,

$scope.getCompanyPages = function () {            
            fb.login(function (response) {
                fb.api('/me/accounts', function (apiresponse) {
                    if (typeof apiresponse !== 'undefined' && typeof apiresponse.data !== 'undefined') {
                        $scope.facebookPages = apiresponse.data;
                        $scope.facebookPages.push({ id: "", name: 'Please select a page' });
                        $scope.selectedItem = $scope.facebookPages[2];
                        console.log($scope.facebookPages);
                    }
                });
            }, { scope: 'manage_pages' });
        };

HTML

<div class="row">
        <div class="col-xs-12 col-sm-6 center">
            <a href="#" ng-click="shareToMyWall()">
                <div class="primary-task">
                    <i class="fa fa-user fa-3x">
                    </i>
                    <h2 class="heading-text fa-bold">Personal Wall</h2>
                </div>
            </a>

        </div>
        <div class="col-xs-12 col-sm-6 center">
            <a href="#" ng-click="getCompanyPages()">
                <div class="primary-task">
                    <i class="fa fa-building fa-3x">
                    </i>
                    <h2 class="heading-text fa-bold">Company Wall</h2>
                </div>
            </a>
            <select ng-if="facebookPages.length > 0" ng-change="shareToFacebookPage(selectedItem.id)" ng-model="selectedItem" ng-options="item.name for item in facebookPages track by item.id"></select>
        </div>
    </div>

上述方法在超链接点击 (ng-click) 事件中调用,当响应返回时,下拉列表应更新数据。数据确实回来了,但它不会立即更新,而是我必须在页面中的任意位置再次单击以更新下拉列表。

当您执行第一个 ng-click 时,模型中的数据会更新。然而,AngualrJS 可能不做检查,所以视图仍然显示旧数据。您可以强制执行 $digest() 检查并告诉 AngualrJS 比较旧数据和新数据,如果有任何差异则更新它。您可以使用 $timeout$evalAsync$apply 来触发 $digest(),这将立即更新数据。

例如:

$timeout(function () {
    $scope.getCompanyPages = function () {...}
    //or
    $scope.facebookPages = apiresponse.data;
})

编辑:根据Angular JS best coding practice

Always wrap 3rd party API call-backs in to $apply to notify AngularJS regarding out of environment changes.