在角度内运行PHP

时间:2014-11-03 17:55:32

标签: php angularjs

我使用angular在wordpress网站中创建页面转换。我的网站加载了一个普通的wordpress页面,该页面触发其PHP并使用角度元素(正文)填充页面。然后角度元素使用动画过渡来更改3个单独的html页面的主体内容(因此页眉和页脚不受影响。)

我在单独的html页面中有PHP。我认为PHP会在每个页面进入视图之前触发 - 但我猜是因为页面是由角度而不是浏览器加载的,这不会发生?

<div id="pageone">
    <p>This is page 1.</p>
    <a href="#page2">Go to page 2 </a><br>

    <?php echo ('this php does not work'); ?>

    <p>This html is below php</p>
</div>

虽然我使用了页面,但同样的概念适用于被视图中的div。无论如何在初始页面加载后使用angular来解雇PHP?这有可能吗?

1 个答案:

答案 0 :(得分:5)

AngularJS完全是客户端。您可以将PHP放在HTML模板中,但如果不将Web服务器配置为将HTML文件解析为PHP,那么您的PHP甚至不会被解析。

即使它确实如此,AngularJS也会缓存这些模板,因此它只会在服务器上“运行”一次。这意味着如果有问题的模板被换出,那么模板使用的服务器上的数据会发生变化,然后再次重新交换,数据的更新将不会反映在模板中,因为绝对没有关于Angular这些更新发生的知识。

像@ Jonast92这样的好主意在他的评论中说,尽量不要混淆客户端和服务器端的问题,并强制实现它们之间的严格分离。在角度应用程序的模板中使用Angular模型。而不是像:

<p><?php echo $item->description; ?></p>

使用角度模型:

<p>{{ item.description }}</p>

如果您需要来自服务器的数据才能执行此操作,请创建一个Angular服务,然后为您提供:

angular.module('app').controller('controller', [
    '$scope', 'ItemManager',
    function($scope, ItemManager) {
        $scope.item = null;

        ItemManager.getItem('item-id').then(
            function(item)  {
                $scope.item = item;
            }, function() {
                console.log('load item failed');
            }
        );
    }
]);

angular.module('app').service('ItemManager', [
    '$http', '$q',
    function($http, $q) {
        var svc = {
            getItem: getItem
        };

        return svc;

        function getItem(id) {
             var defer = $q.defer();
             $http.get('/items/' + id)
                 .success(function(data) {
                     defer.resolve(data);
                 })
                 .error(function() {
                     defer.reject();
                 })
             ;

             return defer.promise;
        }
    }
]);