gpt4 book ai didi

angularjs - 如何使用 `$destroy` 指令并替换为新值

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

我有 2 组数组。第一组是默认设置。当用户单击下一步按钮时,我需要更新新设置。我可以做这个。

但前一组也存在。我不知道如何正确删除它,并定义新值。我正在寻找删除 event listner 的方法同时删除 DOM .和内存泄漏不应该是一样的。

这是我的 js:

var myApp = angular.module('myApp', []);

myApp.controller('main', function ($scope) {

$scope.values = [{"name":"one", "num" : 1}, {"name":"two", "num" : 2}, {"name":"three", "num" : 3}];

$scope.next = function () {
$scope.index = 4;
$scope.values = [{"name":"four", "num" : 4}, {"name":"five", "num" : 5}, {"name":"six", "num" : 6}];

}

$scope.index = 0;

$scope.update = function (value) {
console.log("clicked " + value.num);
$scope.index = value.num;
$scope.$apply();
}

});

myApp.directive("newArray", function ($compile) {

return {

scope : {
value : "=",
index : "=",
update:"&"
},

link : function (scope, element, attrs) {

var getTemplate = function (value, index) {

switch(index) {

case 0 :
return '<div ng-click="update()">I am here {{index}} {{value.name}}</div>'
break;

case 1 :
return $('<div />', {
class:'blue',
html : "<h1>testing{{index}} {{value.name}}</h1>",
click : function () {
scope.update({num: scope.value.num});
}
});
break;

case 2 :
return $('<div />', {
class:'green',
html : "<h1>testing{{index}} {{value.name}}</h1>",
click : function () {
scope.update({num: scope.value.num});
}
});
break;

}

}

element.html(getTemplate(scope.value, scope.index));
$compile(element.contents())(scope);
element.replaceWith(element.contents());

}

}

});

Live Demo

更新我的 plnkr被赞赏。可能有助于我以后的引用。

最佳答案

对于这样一个不同的要求,我不会选择会弄乱的隔离范围指令,因为您想使用带有指令模板的替换指令 DOM。您使用 ng-repeat 的另一个原因当您用新构造的 DOM 替换指令 DOM 时,您的指令没有以正确的方式维护 DOM 结构。而不是我创建了一个简单的指令,该指令在指令内循环并创建一个具有新隔离范围的元素并将其附加到观察者内的伪元素。

标记

<body ng-controller="main">
<a ng-click="next()" href="#">Next</a>
<h1>{{index}}</h1>
<new-array values='values'></new-array>
</body>

指令
myApp.directive("newArray", function ($compile) {
return {
link : function (scope, element, attrs) {
var getTemplate = function (value, index) {
var newScope = scope.$new(true);
newScope.value = value;
switch(index) {
case 0 :
newScope.index = index;
return $compile('<div ng-click="$parent.update(value)">I am here {{value.num}} {{value.name}}</div>')(newScope)
break;
case 1 :
return $compile($('<div />', {
class:'blue',
html : "<h1>testing{{index}} {{value.name}}</h1>",
click : function () {
scope.update({num: scope.values[index].num});
}
}))(newScope);
break;
case 2 :
return $compile($('<div />', {
class:'green',
html : "<h1>testing{{index}} {{value.name}}</h1>",
click : function () {
scope.update({num: scope.values[index].num});
}
}))(newScope);
break;
}
}
scope.$watch('values', function(newVal){
var html = '', dom = $('<div/>');
element.empty();
for(var i=0;i < newVal.length; i++){
element.append(getTemplate(newVal[i], i))
}
//element.replaceWith(dom)
}, true);
}
}
})

Working Plunkr

备注

You can not really think of $destroy in your case. It just like destructor which used to clear the events.

关于angularjs - 如何使用 `$destroy` 指令并替换为新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091278/

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