我有一个AngularJS服务,我想用一些异步数据进行初始化.像这样的东西:
myModule.service('MyService', function($http) {
var myData = null;
$http.get('data.json').success(function (data) {
myData = data;
});
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
}
};
});
Run Code Online (Sandbox Code Playgroud)
显然这不会起作用,因为如果某些东西doStuff()在myData返回之前尝试调用,我将得到一个空指针异常.据我所知,从这里和这里提出的其他一些问题,我有几个选择,但没有一个看起来很干净(也许我错过了一些东西):
使用"运行"设置服务
设置我的应用时,请执行以下操作:
myApp.run(function ($http, MyService) {
$http.get('data.json').success(function (data) {
MyService.setData(data);
});
});
Run Code Online (Sandbox Code Playgroud)
然后我的服务看起来像这样:
myModule.service('MyService', function() {
var myData = null;
return {
setData: function (data) {
myData = data;
},
doStuff: function () {
return myData.getSomeData();
} …Run Code Online (Sandbox Code Playgroud) 继承人html:
<div ng-controller="MyCtrl">
<a ng-click="open()">Open Dialog</a>
<div id="modal-to-open" title="My Title" ui-jq="dialog" ui-options="{width: 350, autoOpen: false, modal: true}">
Dialog Text
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这是js:
function MyCtrl($scope)
{
$scope.open = function () {
$('#modal-to-open').dialog('open');
}
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?似乎有一种更好的方法可以在不访问DOM的情况下打开它,但我不确定如何去做.上面的代码工作,我只是想知道这是否是我应该这样做的方式.欢迎任何输入.
Restful资源并不总是与您的jpa实体进行一对一映射.我认为有一些问题我想弄清楚如何处理:
@JsonIgnore但我仍然会有问题1,3和4.@JsonIdentityInfo)可能的解决方案: 我能想到的唯一方法是处理所有这些问题,就是创建一大堆"资源"类,这些类将具有构造函数,这些构造函数需要实体来构建资源并为此放置必要的getter和setter.资源就可以了.那有点矫枉过正吗?
为了解决2,3,4和5,我可以在将它发送给Jackson以将我的pojo序列化或反序列化为JSON之前对实际实体进行一些预处理和后处理,但这并不能解决问题1.
这些都是我认为其他人会遇到的问题,我很好奇其他人提出的解决方案.(我目前正在使用JPA 2,Spring MVC,Jackson和Spring-Data,但对其他技术开放)
最近,我和一些同事正在讨论AngularJS服务是否应该有州.我们提出了一些支持和反对的论据,我希望得到关于这个主题的更多想法和反馈.在我的搜索中,我发现了这一点,但似乎没有提到任何明确的最佳实践.在无客户端的世界中,服务永远不应该保持状态,但我开始认为它可能是客户端可接受的,因为它是一个不同的问题.
服务持有状态的原因:
服务不成立的原因:
可能在"for services holding state"部分中解决#2的一种方法是在rootScope上设置包含应用程序当前状态的appState对象.然后将所有州聚集在一个位置,然后您只需在服务中提取所需的内容.我发现了这个并且想知道
我的一个java对象上有一个非常大的id.当它将jackson转换为JSON时,它会将其作为数字发送(例如{"id":1000110040000000001})但是一旦它成为javascript对象,id就会变为1000110040000000000.我在这里读到了这个问题
当id较小时,它工作正常.我的第一个想法是强迫杰克逊将所有数字转换成字符串,但我也对其他选项持开放态度.如果可能的话,我宁愿不将Jackson注释添加到我的java对象中.
可能有一种简单的方法可以做到这一点,但我似乎无法找到方法.
当我点击下面显示的删除按钮时,角度会点击以下网址:
http://localhost:8080/rest/managedCourse?id=3
Run Code Online (Sandbox Code Playgroud)
我如何让它来传递路径变量而不是像这样的请求参数:
http://localhost:8080/rest/managedCourse/3
Run Code Online (Sandbox Code Playgroud)
继承人我的HTML:
<table>
<tr ng-repeat="course in page.content">
<td>{{course.title}}</td>
<td>{{course.description}}</td>
<td>{{course.creditValue}}</td>
<td><button ng-click="remove(course.id)">Delete</button></td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
function ManagedCourseController($scope, $resource)
{
var ManagedCourse = $resource("rest/managedCourse/:courseId", {courseId:'@id'});
$scope.page = ManagedCourse.getPage({"page.page": "0", "page.size": "3", "page.sort": "title", "page.sort.dir": "asc"});
$scope.create = function (managedCourse) {
ManagedCourse.create(managedCourse);
}
$scope.remove = function (courseId) {
ManagedCourse.remove({id:courseId});
}
}
Run Code Online (Sandbox Code Playgroud) 有一段时间我一直在想为什么在使用JPA时,我是否必须编写我的删除方法:
@Transactional
public void delete(Account account)
{
if (entityManager.contains(account))
{
entityManager.remove(account);
}
else
{
entityManager.remove(entityManager.merge(account));
}
}
Run Code Online (Sandbox Code Playgroud)
也许不需要包含,因为事务以此方法开始和结束,但我仍然想知道为什么删除不能只是取一个非托管对象.是因为需要对其进行管理才能知道该对象的id是什么?任何其他见解都会很棒.我只是想了解JPA删除的方法和原因.
我看过很多帖子都做了这样的事情,这让我觉得这是可能的,我只是做错了什么.我尽可能简化了它,试图弄清楚为什么会发生这种情况:
继承人我的xml(没什么好激动的):
<?xml version="1.0" encoding="UTF-8"?>
<REPORT>
</REPORT>
Run Code Online (Sandbox Code Playgroud)
这是我的xsl:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="REPORT">
<xsl:variable name="tryThisTemplate">
<xsl:call-template name="TRY_THIS"/>
</xsl:variable>
<TEST1>
<xsl:call-template name="TRY_THIS"/>
</TEST1>
<TEST2>
<xsl:value-of disable-output-escaping="yes" select="$tryThisTemplate" />
</TEST2>
<TEST3>
<xsl:value-of select="$tryThisTemplate" />
</TEST3>
</xsl:template>
<xsl:template name="TRY_THIS">
<MY_NODE desc="my description" />
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这是我的结果:
<?xml version="1.0" encoding="utf-8"?>
<TEST1>
<MY_NODE desc="my description"/>
</TEST1>
<TEST2></TEST2>
<TEST3></TEST3>
Run Code Online (Sandbox Code Playgroud)
这是我的问题:为什么TEST2和TEST3不起作用.$ tryThisTemplate变量似乎为空.我在这里误解了什么.我应该以不同的方式做这件事吗?
我目前正在创建一个存储库,并想知道实体的删除操作的"最佳实践"是什么.在下面的选项中,make和model构成Car实体的键.
选项1:
deleteCar(Car car)
Run Code Online (Sandbox Code Playgroud)
选项2:
deleteCar(String make, String model)
Run Code Online (Sandbox Code Playgroud)
选项3:
deleteCar(CarKey carKey)
Run Code Online (Sandbox Code Playgroud)
起初我认为选项1,但在实践中选项2似乎更吸引人(我不想得到一个对象,当我只有id只是为了我可以将它传递给删除方法).我把选项3放在一边,因为我已经看过类似的东西,但这对我来说似乎不对,因为CarKey实际上并不是一个域对象.
思考?
我一直试图让我的角度ui select2指令初始化,并且无法让它与选项组一起使用.
代码:
function testCtrl1($scope)
{
$scope.selectedOptions = ['1'];
$scope.categories = [
{label: 'cat1', options: [{desc: 'one', value: 1}]},
{label: 'cat2', options: [{desc: 'two', value: 2}]}
];
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<select multiple ui-select2 ng-model="selectedOptions" style="width: 300px">
<optgroup ng-repeat="category in categories" label="{{category.label}}">
<option ng-repeat="option in category.options" value="{{option.value}}">{{option.desc}} - {{option.value}}</option>
</optgroup>
</select>
Run Code Online (Sandbox Code Playgroud)
小提琴: 我创造了以下的jsfiddle.
虽然这样做我注意到如果我包含第二个不包含选项组的select2指令(奇怪),它将正确初始化.当我包括第二个select2时,我注意到其他一些奇怪的行为,但我并不太关心它,因为我的目标只是让testCtrl1工作.
angularjs ×5
jackson ×2
java ×2
javascript ×2
jpa ×2
rest ×2
service ×2
angular-ui ×1
asynchronous ×1
jpa-2.0 ×1
jquery-ui ×1
json ×1
merge ×1
repository ×1
resources ×1
state ×1
transform ×1
xml ×1
xslt ×1