在 AngularJS 中使用 jQueryUI 插件和 ngRepeat 循环中的数据绑定对象数组
Using jQueryUI plugins in AngularJS with a data-bound objects array in a ngRepeat loop
我正在学习 AngularJS 以便在特定项目中使用。
在这个项目中,有些产品可以通过编辑参数列表(特定于产品)来定制。
我正在尝试使用 ngRepeat 为每个参数呈现一个带有可自定义微调器和滑块的输入字段。
因为我没有找到合适的 plugins/directives/whatever 使用纯 angular,我不得不求助于 jQueryUI Slider 和 Spinner 插件。
经过反复试验(以及一些基本的 google-fu),我设法将微调器和滑块绑定到同一范围变量,使用指令并尝试保持 "Angular path"尽可能。
这是工作 fiddle:http://jsfiddle.net/b8gs60fa/4/
然后我尝试使用排列在对象数组中的实际参数数据来实现它,但一切都乱套了。
这是损坏的 fiddle:http://jsfiddle.net/wh3qv3rs/1/
首先,滑块停止工作。每当我尝试使用滑块时,控制台都会显示 jQueryUI 错误 "closestHandle is undefined"。
此外,现在滑块将通过微调器更新,但模型本身不会改变。如果在文本框中手动输入值,则模型会正确更新,但滑块不会。
我的猜测是这个问题引起的:
scope.$apply(function() {
scope[attrs.ngModel] = (parseFloat(ui.value));
});
我认为数据绑定工作正常(因为在文本框中键入也会更改标签),但由于 ngRepeat 为每次迭代创建一个新范围,我只是指(和更新)错误的对象。遗憾的是,我不知道如何解决这个问题。
至于 "closestHandle is undefined" 错误,我不知道是什么导致它出现,我暗暗希望,通过解决绑定问题,这个错误也会自动崩溃。
提前致谢。
转换你的指令,让它们有独立的作用域,那么你在 ng-repeat 中使用它们应该不会遇到任何问题。我在这里更改了您的滑块:
app.directive('slider', function() {
return {
scope : {
ngModel : '='
},
restrict: 'A',
link: function(scope, element, attrs) {
console.log(scope.ngModel);
$(element).slider({
value: scope[attrs.ngModel],
min: parseInt(attrs.min),
max: parseInt(attrs.max),
step: parseFloat(attrs.step),
slide: function(event, ui) {
scope.$apply(function() {
scope.ngModel = (parseFloat(ui.value));
});
}
});
scope.$watch(function() {return scope.ngModel; }, function() {
$(element).slider("value", scope.ngModel);
});
}
};
});
我正在学习 AngularJS 以便在特定项目中使用。 在这个项目中,有些产品可以通过编辑参数列表(特定于产品)来定制。 我正在尝试使用 ngRepeat 为每个参数呈现一个带有可自定义微调器和滑块的输入字段。
因为我没有找到合适的 plugins/directives/whatever 使用纯 angular,我不得不求助于 jQueryUI Slider 和 Spinner 插件。
经过反复试验(以及一些基本的 google-fu),我设法将微调器和滑块绑定到同一范围变量,使用指令并尝试保持 "Angular path"尽可能。
这是工作 fiddle:http://jsfiddle.net/b8gs60fa/4/
然后我尝试使用排列在对象数组中的实际参数数据来实现它,但一切都乱套了。
这是损坏的 fiddle:http://jsfiddle.net/wh3qv3rs/1/
首先,滑块停止工作。每当我尝试使用滑块时,控制台都会显示 jQueryUI 错误 "closestHandle is undefined"。
此外,现在滑块将通过微调器更新,但模型本身不会改变。如果在文本框中手动输入值,则模型会正确更新,但滑块不会。
我的猜测是这个问题引起的:
scope.$apply(function() {
scope[attrs.ngModel] = (parseFloat(ui.value));
});
我认为数据绑定工作正常(因为在文本框中键入也会更改标签),但由于 ngRepeat 为每次迭代创建一个新范围,我只是指(和更新)错误的对象。遗憾的是,我不知道如何解决这个问题。
至于 "closestHandle is undefined" 错误,我不知道是什么导致它出现,我暗暗希望,通过解决绑定问题,这个错误也会自动崩溃。
提前致谢。
转换你的指令,让它们有独立的作用域,那么你在 ng-repeat 中使用它们应该不会遇到任何问题。我在这里更改了您的滑块:
app.directive('slider', function() {
return {
scope : {
ngModel : '='
},
restrict: 'A',
link: function(scope, element, attrs) {
console.log(scope.ngModel);
$(element).slider({
value: scope[attrs.ngModel],
min: parseInt(attrs.min),
max: parseInt(attrs.max),
step: parseFloat(attrs.step),
slide: function(event, ui) {
scope.$apply(function() {
scope.ngModel = (parseFloat(ui.value));
});
}
});
scope.$watch(function() {return scope.ngModel; }, function() {
$(element).slider("value", scope.ngModel);
});
}
};
});