Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS-将值从后端传递到前端_Angularjs - Fatal编程技术网

AngularJS-将值从后端传递到前端

AngularJS-将值从后端传递到前端,angularjs,Angularjs,将值从后端传递到前端的AngularJS的最佳方式是什么?我正在使用Django,模板能够输出我需要的值,但是我不确定将这些值传递给AngularJS的最佳实践是什么 想想一篇博客文章及其评论,如果我有一个AngularJS服务,它通过将文章ID传递给该服务来检索某篇博客文章的所有评论,Django正在呈现HTML模板,它确实知道文章ID是什么,但是我需要将该文章ID传递给AngularJS,然后再传递给该服务 一个想法是将其隐藏在一个隐藏的中,并将此输入分配给一个模型。不太吸引人 另一个是有一

将值从后端传递到前端的AngularJS的最佳方式是什么?我正在使用Django,模板能够输出我需要的值,但是我不确定将这些值传递给AngularJS的最佳实践是什么

想想一篇博客文章及其评论,如果我有一个AngularJS服务,它通过将文章ID传递给该服务来检索某篇博客文章的所有评论,Django正在呈现HTML模板,它确实知道文章ID是什么,但是我需要将该文章ID传递给AngularJS,然后再传递给该服务

一个想法是将其隐藏在一个隐藏的
中,并将此输入分配给一个模型。不太吸引人

另一个是有一个指令,并将属性中的该值传递给该指令,这样我就可以访问该属性的值:

// Django (or any backend) is rendering {{ object.value }}
<div class="myDirective" data-object-id={{ object.value }}>
   ...
</div>

angular.module('myDirectives', []).
    directive('myDirective', function() {
        return {
            restrict: 'C',
            transclude: false,
            link: function postLink($scope, $element, $attrs) {
                // $attrs.objectId would have the value
            }
        }
    });
//Django(或任何后端)正在呈现{{object.value}
...
angular.module('myDirectives',[])。
指令('myDirective',函数(){
返回{
限制:“C”,
排除:错误,
链接:函数postLink($scope、$element、$attrs){
//$attrs.objectId将具有该值
}
}
});

这两种方法看起来不错。但我想知道有没有更干净的方法?任何遵循AngularJS最佳实践的方法?

如果您只需要为给定的“页面”(即对视图的后端调用)设置初始值,那么您可以按照演示的方式执行。我只想通过javascript设置一个全局变量来“更干净”,如下所示:

// Django (or any backend) is rendering {{ object.value }}
<script>
  var backendVars = {
    {{object.name}} : {{object.value}}
    //and any other objects, manually parsed
  }
</script>

另外,我应该注意到,您不应该将数据和逻辑直接放在指令上——它们是用于DOM操作的——而是在控制器上获取信息,然后通过作用域继承、属性或双向数据绑定将其传递给指令。希望有帮助。

如果您只需要从视图中初始化少数模型值,
ng init
指令可能就是您要寻找的:

使用它,您可以简单地编写:

<div ng-init="myModel=backend-generated-value-here">
   ...
</div>

...

如上所述,由于AngularJS专注于Web2.0,即完整的客户端web应用程序,您可能很难为您的用例找到最佳实践。目前,它在服务器端生成内容方面的效果并不理想。在AngularJS的未来版本中,它可能会发生变化。

我认为正确的方法是服务器使用依赖项呈现脚本,然后将其注入到应用程序中。像这样:

index.php:

<html ng-app='myApp'>

<head>
    <title>AngularJS Back to Front</title>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.min.js"></script>
    <script src='index.js'></script>
    <?php
        $globals = array(
            'count' => 1, 
            'title' => 'Active users',
            'users' => array(
                'name' => 'john',
                'age'  => 21
            )
        );

        $globalsJSON = json_encode( $globals )
    ?>

    <script>
        myApp.value('globals', <?=$globalsJSON;?>);
    </script>
</head>

<body ng-controller="myController">
    <div>{{title}}</div>
</body>

</html>

我无法调用web服务,因为它取决于后端传递的值。想想一篇博客文章和显示这篇博客文章的视图,如果我有一个API返回这篇博客文章信息,我需要将文章ID传递给web服务以检索其数据。那么答案的第一部分就是你所要求的。但这并不是“角度上的”——您使用的是一个大的(且高度结构化的)MVC框架来完成一个较小的、类似工具带的框架(如jQuery或更面向模型的东西)的工作。在angular中,你会这样想:当你可以调用你的.com/#/blog/123并使用$route和$html获取博客内容时,为什么要调用你的.com/blog/123并用每个不同的页面引导一个应用程序,而当你改变视图时,永远不要离开页面(应用程序)?再说一次,如果是为了博客之类的东西,角度可能不是最好的选择。你说得对。我宁愿不污染全局名称空间,但我正试图尽可能避免全局变量。谢谢你的回答,我会选择我提到的两种方法,或者使用@pkozlowski.opensource所描述的
ng init
。Thiago的答案和AngularJS方法在这类事情上存在问题。根据@pkozlowski.opensource,“AngularJS专注于Web2.0,即完整的客户端web应用程序。目前它在服务器端生成内容方面并不理想。”但使用“you.com/#/blog/123”和“$route和$html获取博客内容”陷入另一组与JavaScript虚拟机和hashbang的依赖性相关的客户端问题,他们说它破坏了web()。那怎么办?谢谢。我想说,我的应用程序大约90%已经转换到客户端,而后端(Django)纯粹是为RESTAPI服务的,更好的方法是创建一个自定义指令,将数据从html传递到控制器。。。他们是否都想一次读取相同的代码区域?将php添加到一个已经很复杂的场景中对我来说似乎不太好。
<html ng-app='myApp'>

<head>
    <title>AngularJS Back to Front</title>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.min.js"></script>
    <script src='index.js'></script>
    <?php
        $globals = array(
            'count' => 1, 
            'title' => 'Active users',
            'users' => array(
                'name' => 'john',
                'age'  => 21
            )
        );

        $globalsJSON = json_encode( $globals )
    ?>

    <script>
        myApp.value('globals', <?=$globalsJSON;?>);
    </script>
</head>

<body ng-controller="myController">
    <div>{{title}}</div>
</body>

</html>
var myApp = angular.module( 'myApp', [] );

myApp.controller( 'myController', [ 'globals', '$scope', function( globals, $scope ) {
    // Copy globals to scope
    for ( var property in globals ) {
        $scope[ property ] = globals[ property ];
    }
}]);