我在使用自定义指令时遇到问题,这使我发疯。我正在尝试创建以下自定义(属性)html" target="_blank">指令:
angular.module('componentes', [])
.directive("seatMap", function (){
return {
restrict: 'A',
link: function(scope, element, attrs, controller){
function updateSeatInfo(scope, element){
var txt = "";
for (var i in scope.seats)
txt = txt + scope.seats[i].id + " ";
$(element).text("seat ids: "+txt);
}
/*
// This is working, but it's kind of dirty...
$timeout(function(){updateSeatInfo(scope,element);}, 1000);
*/
scope.$watch('seats', function(newval, oldval){
console.log(newval, oldval);
updateSeatInfo(scope,element);
});
}
}
});
这个“属性类型”指令(称为seatMap)试图显示一个席位ID列表(例如,一个剧院),我将通过$
resource服务(请参见下面的代码)从服务器获取该ID到div(元素) 。
我将其与以下简单的部分html一起使用:
<div>
<!-- This is actually working -->
<ul>
<li ng-repeat="seat in seats">{{seat.id}}</li>
</ul>
<!-- This is not... -->
<div style="border: 1px dotted black" seat-map></div>
</div>
这是正在加载示波器的控制器:
function SeatsCtrl($scope, Seats) {
$scope.sessionId = "12345";
$scope.zoneId = "A";
$scope.seats = Seats.query({sessionId: $scope.sessionId, zoneId: $scope.zoneId});
$scope.max_seats = 4;
}
其中“ Seats”是使用$ resources从服务器获取JSON的简单服务
angular.module('myApp.services', ['ngResource'])
.factory('Seats', function($resource){
return $resource('json/seats-:sessionId-:zoneId.json', {}, {});
})
;
app.js(asientos_libres.html是我一直使用的部分):
angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'componentes']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/view1', {templateUrl: 'partials/asientos_libres.html', controller: SeatsCtrl});
$routeProvider.otherwise({redirectTo: '/view1'});
}]);
问题是,即使我在指令的链接函数中设置了“ scope。$ watch”,以便作用域可以检查“ seats”属性是否已更改以更新ID列表,但在$
scope.seats在控制器中更改的时刻(当我们称为“查询”时)。
正如您可能在代码中看到的那样,我尝试使用$ timeout来延迟“ updateSeatInfo”的启动,但恐怕它并不是到目前为止最聪明的解决方案…
我还尝试不发出JSON请求,而是在$ scope.seats中使用硬编码字典,它可以工作,因此似乎是同步问题。
注意:updateSeatInfo只是一个测试函数,我将使用的实际函数要复杂一些。
关于如何应对的任何想法?
事先非常感谢您!
编辑1: 添加了app.js,在此我使用路由器调用SeatsCtrl,这要感谢Supr的建议。但是,我仍然遇到同样的问题。
编辑2:解决(?)
好!看来我找到了一个解决方案,虽然可能不是最好的,但它工作正常!:)至于我能在这里看到http://docs.angularjs.org/api/ng.$timeout,我们可以使用$超时(超过setTimeout的包装)
无延迟 !这很棒,因为我们没有在$ timeout内人为地延迟执行代码,但是我们正在使指令在异步请求完成之前不要运行它。
希望它也适用于长期等待的请求…
如果有人知道更好的解决方法,请告诉我们!
问题是手表默认情况下比较引用而不是对象。最后添加,true以使其比较值。
scope.$watch('seats', function(newval, oldval){
console.log(newval, oldval);
updateSeatInfo(scope,element);
}, true);
问题内容: 如果我有一个没有模板的AngularJS指令,并且希望它在当前作用域上设置一个属性,那么最好的方法是什么? 例如,计算按钮点击次数的指令: 使用伪指令将点击计数分配给双向属性中的表达式: 有一个更好的方法吗?从我所读的内容来看,孤立的作用域会过大,但是我需要一个子作用域吗?除了使用以外,还有没有更干净的方法可以写回指令属性中定义的范围变量。我只是觉得我很难过。 这里有完整的柱塞。 问题
问题内容: 我是AngularJS的新手,目前正在处理一个输入字段,该字段可以一次接受多个标签以及自动完成功能,该功能将可用标签显示为下拉选项。为此,我使用在Web上找到的指令(http://mbenford.github.io/ngTagsInput/),该指令为我提供了一个自定义HTML元素。这很漂亮: : : 但是,我想使用标准HTML 元素而不是指令附带的自定义元素,因此,在很多帮助和使用
问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如
问题内容: 此自定义验证指令是官方角度网站上提供的示例。 http://docs.angularjs.org/guide/forms会 检查文本输入是否为数字格式。 为了对该代码进行单元测试,我编写了以下代码: 然后我得到这个错误: 我到处都放置了print语句以查看发生了什么,而且该指令似乎从未被调用过。测试像这样的简单指令的正确方法是什么? 问题答案: 另一个答案的测试应写为: 请注意,now
问题内容: $ resource非常棒,它提供了非常方便的方式来处理Web服务。如果必须在不同的URL上执行GET和POST怎么办? 例如,GET URL是, 而POST URL 没有任何参数 问题答案: 您应该能够将URL作为参数公开。我能够做到这一点: 然后,您可以覆盖通话中的URL 。 在我的简短测试中发现的一个警告是,如果我将URL字符串包含在内,则该字符串将无法正常工作。我没有收到错误消
创建自定义指令 第一步,创建一个自定义命令类文件,新建application/common/command/Hello.php <?php namespace app\common\command; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\con