我目前正在尝试构建一个使用jQuery UI手风琴控件的AngularJS应用程序。
问题是, 在 我的AngularJS服务完成从服务器加载数据 之前 启动了jQuery
UI手风琴。换句话说:手风琴启动时没有任何数据,因此填充来自AngularJS的数据时也不会显示。
该视图如下所示:
<!-- Pretty standard accordion markup omitted -->
$("#b2b-line-accordion").togglepanels();
我的AngularJS控制器如下所示:
app.controller('orderController', function ($scope, orderService, userService) {
// Constructor for this controller
init();
function init() {
$scope.selected = {};
$scope.totalSum = 0.00;
$scope.shippingDate = "";
$scope.selectedShippingAddress = "";
$scope.orderComment = "";
$scope.agreements = false;
$scope.passwordResetSuccess = false;
$scope.passwordResetError = true;
userService.getCurrentUser(2).then(function (response) {
$scope.user = response.data;
orderService.getProductCategoriesWithProducts($scope.user).then(function (d) {
$scope.categories = d.data;
});
});
}
// Other methods omitted
});
我的AngularJS服务看起来像这样:
app.service('orderService', function ($http) {
this.getProductCategoriesWithProducts = function (user) {
return $http.post('url to my service', user);
};
});
app.service('userService', function ($http) {
this.getCurrentUser = function(companyId) {
return $http.get('url to my service' + companyId + '.aspx');
};
this.resetPassword = function() {
return true;
};
});
有什么办法告诉手风琴“等待”初始化,直到从服务返回数据?:-)
提前致谢!
更新资料
我尝试链接方法,并添加了一些日志记录,似乎手风琴实际上是在从服务返回JSON之后启动的。
userService.getCurrentUser(2).then(function(response) {
$scope.user = response.data;
}).then(function() {
orderService.getProductCategoriesWithProducts($scope.user).then(function(d) {
$scope.categories = d.data;
console.log("categories loaded");
}).then(function () {
$("#b2b-line-accordion").accordion();
console.log("accordion loaded");
});
});
但是,它不显示手风琴:-(第一个手风琴div在生成的DOM中看起来不错:
<div id="b2b-line-accordion" class="ui-accordion ui-widget ui-helper-reset" role="tablist">
...
</div>
但是其余的标记(与角度进行数据绑定)未启动。
完整标记:
<div id="b2b-line-accordion">
<div ng-repeat="productCategory in categories">
<h3>{{ productCategory.CategoryName }}</h3>
<div class="b2b-line-wrapper">
<table>
<tr>
<th>Betegnelse</th>
<th>Str.</th>
<th>Enhed</th>
<th>HF varenr.</th>
<th>Antal</th>
<th>Bemærkninger</th>
<th>Beløb</th>
</tr>
<tr ng-repeat="product in productCategory.Products">
<td>{{ product.ItemGroupName }}</td>
<td>{{ product.ItemAttribute }}</td>
<td>
<select ng-model="product.SelectedVariant"
ng-options="variant as variant.VariantUnit for variant in product.Variants"
ng-init="product.SelectedVariant = product.Variants[0]"
ng-change="calculateLinePrice(product); calculateTotalPrice();">
</select>
</td>
<td>{{ product.ItemNumber }}</td>
<td class="line-amount">
<span class="ensure-number-label" ng-show="product.IsNumOfSelectedItemsValid">Indtast venligst et tal</span>
<input type="number" class="line-amount" name="amount" min="0" ng-change="ensureNumber(product); calculateLinePrice(product); calculateTotalPrice();" ng-model="product.NumOfSelectedItems" value="{{ product.NumOfSelectedItems }}" />
<td>
<input type="text" name="line-comments" ng-model="product.UserComment" value="{{ product.UserComment }}" /></td>
<td><span class="line-sum">{{ product.LinePrice | currency:"" }}</span></td>
</tr>
</table>
</div>
</div>
</div>
解
终于我找到了解决方法!我不确定是不是很漂亮,是否是Angular做事的方式(我想不是)
用以下代码制作指令:
app.directive('accordion', function () {
return {
restrict: 'A',
link: function ($scope, $element, attrs) {
$(document).ready(function () {
$scope.$watch('categories', function () {
if ($scope.categories != null) {
$element.accordion();
}
});
});
}
};
});
因此,基本上,当DOM准备就绪时,当category数组发生更改时(数据加载后即会执行此操作),我将启动jQuery UI手风琴。
非常感谢@Sgoldy在这里向我指出正确的方向!
是的,您需要一个,directive
并且您可以处理这种更加棱角分明的方式!
中HTML
定义指令
<div ui-accordion="accordionData" ></div>
promise
从您返回service
并将传递promise
给指令。
在控制器中
$scope.accordionData = myService.getAccordionData();
该ui-accordion
指令看起来像
.directive('uiAccordion', function($timeout) {
return {
scope:{
myAccordionData: '=uiAccordion'
},
template: '<div ng-repeat="item in myData"><h3 ng-bind="item.title"></h3><div><p ng-bind="item.data"></p></div></div>',
link: function(scope, element) {
scope.myAccordionData.then(function(data) {
scope.myData = data;
generateAccordion();
});
var generateAccordion = function() {
$timeout(function() { //<--- used $timeout to make sure ng-repeat is REALLY finished
$(element).accordion({
header: "> div > h3"
});
});
}
}
}
})
服务电话成功后,then
您就可以创建手风琴了。在这里您可以定义自己的accordion-template
喜欢
<div ng-repeat="item in myData">
<h3 ng-bind="item.title"></h3>
<div>
<p ng-bind="item.data"></p>
</div>
</div>
模板与您的模型数据绑定myData
。我ng-repeat
在模板内部使用创建accordion-header
和accordion-body
HTML
。
在此generateAccordion
方法中,我将使用$timeout
来确保ng- repeat
真正完成渲染,因为$timeout
它将在当前摘要周期的末尾执行。
检查 [**Demo**](http://plnkr.co/edit/PPXyIfNnDFCXwfKLRySp?p=preview)
问题内容: 我正在尝试通过Ajax获取json对象,并仅用一种值填充Bootstrap Typeahead。 这是我的代码: 我收到 arr为null* 的错误 * 我也尝试过但没有成功: 我该怎么做才能在Typeahed中仅显示我的Json对象的名称值? 如果在“ Ajax成功”中,我将其正确地提醒我的Json对象。 问题答案: 我从头开始: 一个简单的JSON数组在哪里? 如果您的数组具有不同
我在domino设计器8.5.3中创建了一个java web服务消费者,它使用字符串参数调用WS操作并获取字符串响应。 现在我想创建一个带有1个编辑框、1个计算字段和1个按钮的XPage。单击按钮后,我想运行使用WS使用者的服务器端javascript(从框中获取输入并在计算字段中显示响应)。 首先,是否可以通过XPages调用WS?有测试过的溶液吗? 我试过: > http://www-10.l
目录 1.搭建.net开发环境 1.1下载安装iis7.0,下载安装vs2015,配置IIS 1.2下载开发工具 1.3开发工具介绍 1.4设置开发工具 1.5开启服务和打开数据库 2.运行开发案例 2.1设置开发工具的编译路径 2.2编译UI资源 2.3拷贝UI资源到发布路径下 2.4打开IIS启动网页 2.5在开发工具里启动tomcat,运行案例 3.建立数据库和库表 3.1建立数据库 3.2
我知道这个话题已经贴了很多次了,但这个问题没有真正的解决办法。 最近,在一些应用程序中,我决定进行更新。这是将库版本(admob)更改为最新版本的一次小更新。我还将targetSdkVersion从25更改为26。几天后,我检查了admob上的统计数据,所有这些应用的填充率都降到了0!请求的数量也增加了。用于横幅和间隙。其他应用程序不受影响。 我认为有一些愚蠢的错误,但我在代码中找不到任何问题。
问题内容: 我无法手动或自动在新保存的对象上填充创建者字段……我能找到的唯一方法是重新查询我已经想要做的对象。 这是设置: 这是我拉头发的地方 编辑:最新的猫鼬解决了此问题并添加了填充功能,请参见新的接受的答案。 问题答案: 您应该能够使用模型的填充函数来执行此操作:http : //mongoosejs.com/docs/api.html#model_Model.populate 在书籍的保存处