【发布时间】:2015-06-12 11:07:17
【问题描述】:
我正在创建一个应用程序,其中 Ajax 请求从服务器获取包列表并显示它们。 之后,我创建了一个名为“packageDetails”的指令,该指令应用于单个包。
指令必须做两件事:
1- 单击元素时通过 AJAX 请求从服务器获取详细信息
2- 从页面的其他地方选取一些 HTML 并将其插入到被点击的包旁边。
我的问题:单击包时,AJAX 请求正在从服务器获取详细信息,并且正在操纵 DOM。我还可以看到范围变量$scope.packageDetails 在控制器中得到更新。但变化并没有反映在视图中。 但是,如果我再次单击一个包,这次视图会更新。
到目前为止我所尝试的:
在指令和控制器中都使用了 scope.$apply。这似乎是其他开发人员最常见的问题,但并没有解决我的问题。
尝试在元素中使用 ng-click,但没有成功。
代码如下:
控制器
/*
an array that creates the rows and columns
$scope.packageList = [];
*/
$scope.getPackageDetails = function (packageId) {
console.log('get details for ' + packageId);
ajaxService.getPackageDetails(packageId).then(function (data) {
if (parseInt(data.ResponseStatus, 10) === 0) {
$scope.packageDetails = data.Packages;
// i have tried $scope.$apply() here; doesn't work
}
});
查看
<div class="row" ng-repeat="columnPackages in packageList">
<div class="col-md-3 onePackage" ng-repeat="package in columnPackages" package-details package-id="{{package.Id}}" click="getPackageDetails" has-response="response" >
<figure>
<a class="package_view">
<strong>{{package.Name}}</strong>
</a>
</figure>
</div>
</div>
指令
epApp.directive('packageDetails', function () {
return {
scope:
{
hasResponse: '=hasResponse',
click: '=click'
},
link: function (scope, elem, attrs) {
if (scope.$parent.$last) {
$(elem).parent('div.row').find('div.onePackage').on('click', function () {
/* some dom manipulation */
var packages_content = jQuery('.packages_widget_append').html();
jQuery(this).closest(".row").after(packages_content);
/* called parent controller function to get the details*/
console.log('clicked ' + parseFloat(attrs.packageId));
scope.click(parseFloat(attrs.packageId));
// i have tried $scope.$apply() here as well; doesn't work
});
}
}
}
});
请帮忙。
谢谢。
【问题讨论】:
-
调用$apply时是否报错?您是否尝试过使用 $timeout(没有延迟)?
-
如果我在指令中调用 $apply,则没有错误,但如果我在收到响应后立即从控制器调用它,则会收到错误
Error: [$rootScope:inprog] http://errors.angularjs.org/1.2.28/$rootScope/inprog?p0=%24digest z/<@http://localhost/EPV2/js/vendor/angular.min.js:6:450。 -
正如 c0bra 提到的,尝试将它包装在 $timeout 周围,不要延迟。这不会给您带来正在进行的摘要错误。
-
@AbhishekJain 也立即尝试超时。还是不行。
-
你能为此创建一个 plunker 吗?
标签: jquery angularjs angularjs-directive angularjs-scope