javascript - AngularJS 组件数据绑定不起作用
问题描述
我使用 AngularJS 1.7.8 构建了我的第一个组件,但双向数据绑定不起作用。我可以使用“<”而不是“=”来初始化我的组件。
Javascript 组件
angular.module("App").component("timeComponent", {
template: "<div class=\"form-group\"><label class=\"control-label col-xs-3\">{{$ctrl.label}}</label><div class=\"col-sm-9\" style=\"display:inline-flex\">" +
"<select ng-change=\"$ctrl.change()\" ng-model=\"$ctrl.hour\" class=\"form-control\" style=\"width:65px;\">" +
"<option ng-repeat=\"o in $ctrl.hours\" ng-value=\"o.value\">{{o.label}}</options>" +
"</select>" +
"<select ng-change=\"$ctrl.change()\" ng-model=\"$ctrl.minute\" class=\"form-control\" style=\"width:65px;\">" +
"<option ng-repeat=\"o in $ctrl.minutes\" ng-value=\"o.value\">{{o.label}}</options>" +
"</select>" +
"</div></div>",
bindings: {
label: "@",
value: "=",
min: "<",
max: "<"
},
controller: function () {
var vm = this;
vm.hour = 0;
vm.minute = 0;
vm.hours = [{ value: 0, label: "0" }, { value: 1, label: "1" }, { value: 2, label: "2" }, { value: 3, label: "3" }, { value: 4, label: "4" }, { value: 5, label: "5" }, { value: 6, label: "6" }, { value: 7, label: "7" }, { value: 8, label: "8" }];
vm.minutes = [{ value: 0, label: "0" }, { value: 25, label: "15" }, { value: 50, label: "30" }, { value: 75, label: "45" }];
vm.$onInit = function () {
vm.min = vm.min || -1;
vm.max = vm.max || -1;
console.log("init", vm.value);
vm.value = vm.value || 0;
vm.hour = Math.trunc(vm.value);
vm.minute = Math.trunc(((vm.value - vm.hour) * 100));
console.log("$onInit", vm);
}
vm.change = function () {
vm.value = vm.hour + (vm.minute / 100);
}
}
});
HTML
<time-component value="Object.workHours" label="Hours" max="8.25"></time-component>
使用 $http.get 加载参数“Object.workHours”。
如果我在模板中使用“$ctrl.value”,则显示该值,但如果我在控制器中使用“vm.value”,则该值未定义。
更新
我在这个PLNKR中重现了这个问题
更新
我刚刚找到了解决问题的方法
$scope.$watch(() => this.value,
(newValue, oldValue) => {
vm.hour = Math.trunc(this.value);
vm.minute = Math.trunc(((this.value - this.hour) * 100));
});
这里是带有解决方案的新PLNKR。
解决方案
推荐阅读
- node.js - Node.js - Postman 中的 HTTP POST 请求问题
- ios - 调用 didEnterBackground 后是否可以在主线程上执行某些操作?
- pine-script - 布尔表达式评估和性能
- javascript - VUE - 数据对象总是作为引用传递还是有时被复制?
- python - 如何使用 iterrows 更正 Python Pandas 数据框中的值?
- java - z/OS C/C++ fseeko 对于多卷数据集非常慢
- angular - 关闭身份验证时的默认用户(Angular)
- java - JavaFX 任务等待
- python - 读取包含标题的多行 CSV 文件
- reactjs - 当我在 Postman 中测试时,AWS Lambda 函数可以使用,但是当我尝试在我的 ReactJS 中实现时,我得到状态码 500