AngularJS-将值从后端传递到前端
将值从后端传递到前端的AngularJS的最佳方式是什么?我正在使用Django,模板能够输出我需要的值,但是我不确定将这些值传递给AngularJS的最佳实践是什么 想想一篇博客文章及其评论,如果我有一个AngularJS服务,它通过将文章ID传递给该服务来检索某篇博客文章的所有评论,Django正在呈现HTML模板,它确实知道文章ID是什么,但是我需要将该文章ID传递给AngularJS,然后再传递给该服务 一个想法是将其隐藏在一个隐藏的AngularJS-将值从后端传递到前端,angularjs,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 ];
}
}]);