gpt4 book ai didi

javascript - 指令内的 Angular watch 没有 Controller ?

转载 作者:行者123 更新时间:2023-12-03 12:39:48 24 4
gpt4 key购买 nike

我在将 $scope.modalClick 更新绑定(bind)到scope.modalClick 时遇到问题,我认为使用scope:{ modalClick:"="} 可以修复它,但事实并非如此。如何进行从子作用域 (scope) 到父作用域 ($scope) 的两种方式绑定(bind)。

这是我的标记

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<script src="lib/angular/angular.min.js"></script>
<script src="lib/angular-animate/angular-animate.min.js"></script>
<script src="js/modal.js"></script>
<style>

.btn { width:200px; height:30px; background-color:rgb(30, 50, 100); color:white; line-height:30px; text-align:center; }
.btn:hover { background-color:#005cab; cursor:pointer; cursor:hand; }
.modal-window-directive { width:100%; height:300px; background-color:orange; background-color:rgba(20, 20, 20, .5); }

</style>
</head>
<body>
<div modal-click="partials/form.html" modal-id="modform" bgcolor="rgb(10, 10, 10, .5)" width="400" height="200"class="btn">click me</div>
</body>
</html>

这是我的 JavaScript

if(typeof qs === "undefined"){

window.qs = function(arg){ return document.querySelector(arg); };

}

var app = angular.module("modal", ["ngAnimate"]);

app.run(function($rootScope){

console.log($rootScope);

});

angular.element(document).ready(function(){

angular.bootstrap(document.querySelector("html"), ["modal"]);

});

function AppCtrl ($scope){

$scope.setSource = function(src){



}

$scope.closeModal = function(){



}

$scope.openModal = function(){



}

}

app.directive("modalClick", function($compile, $document){

return {

restrict:"A",
scope:{

modalClick:"@",
modalId:"@",
bgcolor:"@",
width:"@",
height:"@"

},

controller:"AppCtrl",

link:function(scope, element, attr, ctrl){

var modalElement = angular.element("<div class='modal-window-directive' style='position:absolute; top:0; bottom:0; left:0; right:0; width:100%; height:100%;'></div>");

var modal = angular.element("<div class='modal-window-frame' ng-include='modalClick'></div>");

angular.element(document.body).append(modalElement);

if(scope.bgcolor){

modalElement.css({backgroundColor:scope.bgcolor});

} else {

modalElement.css({backgroundColor:});

}

modalElement.append(modal);
$compile(modal)(scope);


scope.modalActive = false;

scope.$watch("modalActive", function(newVal){

if(newVal){

console.log("newVal :" + newVal);

}


})

scope.toggle = function(){

scope.$apply(function(){

scope.modalActive = !scope.modalActive;

})

}

element.bind("click", function(e){

scope.toggle();

})


}

}

});

我知道有办法做到这一点。我是否遗漏了我范围内的某些内容?我必须在html中找到它到 Controller 吗?我不确定如何解决这个问题,任何人都可以帮助我或为我指出正确的方向吗?我应该使用 $compile 作为 Angular 元素吗?

最佳答案

为了绑定(bind)到父作用域的属性,您需要将其作为属性值传递,并在隔离作用域中执行双向数据绑定(bind)。现在您没有将该属性作为属性值传递。

此外,您不需要指令中的 Controller 来绑定(bind)到父作用域。

最后,是的,您需要 $compile 元素以使其“Angular 感知”(例如,让 ngInclude 生效)。

HTML:

<div modal-click template-url="modalClick" class="btn">click me</div>

Controller :

function AppCtrl ($scope){
...
$scope.modalClick = 'partial/form.html';
...

指令:

app.directive("modalClick", function($compile, $document){
return {
restrict: 'A',
scope:{
templateUrl: '='
},
link:function(scope, element, attr){
/* Now `scope.templateUrl` is 2-way bound
* to parent scope's `modalClick` property */

var modalElement = angular.element('<div class="modal-window-directive"><div class="modal-container-element" ng-include="templateUrl"></div></div>');

$document.find('body').append(modalElement);
$compile(modalElement)(scope);
}
};
});

关于javascript - 指令内的 Angular watch 没有 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574129/

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