Angular和JQuery之间的执行时间
我有一个通过Angular动态填充的页面。实质上,Angular向后端发出$http.get
请求以获取数据并填充控制器的属性。Angular和JQuery之间的执行时间
例如,我打电话$http.get('/_car_data')
和返回的JSON被保存到我的控制器Dealership
作为Dealership.cars
。
通过Angular,我输出所有的Dealership.cars
作为输入框在我的html页面。
我的问题是,我想为每个输入添加一个jquery'autocomplete'。如果我在页面和角度已完全呈现后通过Google Developer控制台执行此操作,则此功能非常好。但是,如果我在将脚本链接到html之后并在html正文之后包含此功能,则它不起作用。如果我用$(document).ready
包围此自动完成功能,它也不起作用。
这是在谷歌开发者控制台中运行时完美运行的函数,但不包括在外部链接的js和html主体之后。
$(document).ready(function() {
var availableTags = [];
$.ajax({
url: '_available_cars',
data: {},
method: 'GET',
dataType: 'json',
success: function(data) {
availableCars = data['cars'];
$(".carchoice").autocomplete({
source: availableCars
});
},
error: function(jqXHR, textStatus, errorThrown, data) {
console.log(textStatus, errorThrown);
}
});
});
所以我的问题是,我怎么等到所有的HTML和角度创建的,动态加载的内容呈现完毕后执行我的jquery语句?
jQuery应该与angularjs交流的最好和独特的方式是通过指令。我建议你避免任何形式的快捷方式和黑客入侵,只需一点点代码就会变成真正的混乱。
这里是我对如何解决问题的理解。
angular.module('myApp', []);
angular.module('myApp').factory('CarService', function ($http, $q) {
var cars = [];
return {
getAvailableCars: function() {
if(cars) return $q.resolve(cars);
return $http.get('_available_cars').then(function (response) {
cars = response.data;
return cars;
});
}
};
});
angular.module('myApp').directive('carchoice', function(CarService) {
return {
restrict: 'C',
link: function(scope, element, attrs) {
CarService
.getAvailableCars()
.then(function (availableCars) {
$(element).autocomplete({
source: availableCars
});
});
}
};
});
不是什么大不了,但FYI'元素'已经是jQuery,如果jQuery.js包含在页面之前angular.js – charlietfl
我让'element'由jquery的函数包装的原因是因为它更通用并清楚代码中发生了什么。尽管元素已经可以被jQuery包装了,但它不会引起任何问题,对吧?因为jQuery在他的内部处理它。但是,无论如何,谢谢你指出我们通常不会注意到的一个好事实。 –
没有问题,有些人可能不会在angular.js之前包含它。它和'$($(selector))'是一样的。但是,如果所有配置正确,只需执行'element.pluginName()' – charlietfl
你必须以angularjs的方式做到这一点。也就是说,有指令。 –
问题和思考是错误的。你需要在指令中调用插件。然后你放心元素存在 – charlietfl