gpt4 book ai didi

javascript - 为什么 $render 从来没有接到电话

转载 作者:行者123 更新时间:2023-11-30 12:29:29 24 4
gpt4 key购买 nike

我有以下代码片段。

<!DOCTYPE html>
<html ng-app="exampleApp">
<head>
<title>CustomForms</title>
<script src="angular.js"></script>
<link href="bootstrap.css" rel="stylesheet" />
<link href="bootstrap-theme.css" rel="stylesheet" />
<script type="text/ng-template" id="triTemplate">
<div class="well">
<div class="btn-group">
<button class="btn btn-default">Yes</button>
<button class="btn btn-default">No</button>
<button class="btn btn-default">Not Sure</button>
</div>
</div>
</script>
<script>
angular.module("exampleApp", [])
.controller("defaultCtrl", function ($scope) {
$scope.dataValue = "Not Sure";
})
.directive("triButton", function () {
return {
restrict: "E",
replace: true,
require: "ngModel",
template: document.querySelector("#triTemplate").outerText,
link: function (scope, element, attrs, ctrl) {
element.on("click", function (event) {
setSelected(event.target.innerText);
scope.$apply(function () {
ctrl.$setViewValue(event.target.innerText);
});
});

var setSelected = function (value) {
var buttons = element.find("button");
buttons.removeClass("btn-primary");
for (var i = 0; i < buttons.length; i++) {
if (buttons.eq(i).text() == value) {
buttons.eq(i).addClass("btn-primary");
}
}
}

ctrl.$render = function () {
console.log("render");
setSelected(ctrl.$viewValue || "Not Sure");
}
}



}
});
</script>
</head>
<body ng-controller="defaultCtrl">
<div><tri-button ng-model="dataValue"/></div>
<div class="well">
Value:
<select ng-model="dataValue">
<option>Yes</option>
<option>No</option>
<option>Not Sure</option>
</select>
</div>
</body>
</html>

当我更改选择选项的值时,会调用 ctrl.$render,但为什么当我单击按钮时 ctrl.$render 永远不会被调用?

最佳答案

$render 仅在 $viewValue 具有与模型不同的值时调用。在您的情况下,当 $setViewValue 被调用时,它将首先设置 $viewValue 然后将模型设置为相同的值。因为 $viewValue 首先更新,当 AngularJS 获取模型更改时,它会看到 $viewValue 具有相同的值,因此不会调用 $渲染

如果您想要调用 $render,要么像@SoluableNonagon 指出的那样强制执行它,要么修改点击处理程序以更改模型而不是调用 $setViewValue。这是展示后一种方法的 plunkr:http://plnkr.co/edit/uAqSxsAd49FkXa5Yu5Vs?p=preview .相关的代码是:

var ngModelSet = $parse(attrs.ngModel).assign                    

element.on("click", function (event) {
setSelected(event.target.innerText);
scope.$apply(function () {
ngModelSet(scope, event.target.innerText)
})
});

关于javascript - 为什么 $render 从来没有接到电话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com