[英]Use getElementById on newly created DOM object before it is inserted into the document — HOW?
[英]How to pass an angular scope object to a newly created DOM
我在控制器中創建了一個有角度的對象(模型)。
$scope.deletedres = [];
我試圖將新的DOM連同角對象(模態)一起添加到html主體,如下所示。
$('body').append('<span>'+restaurant.name+' have been removed.</span><a class="btn-flat yellow-text" href="#"; ng-click="addRestaurant($scope.deletedres[$scope.deletedres.length-1])">Undo<a>');
當我使用Google chrome開發工具查看它時,它表明$scope.deletedres
作為[object Object]和addRestaurant()函數什么都沒收到。
誰能在這個問題上啟發我?
還有其他方法可以將角度模態參考/傳遞給新創建的DOM嗎?
您添加DOM的方式是錯誤的。 在控制器范圍內添加html。 使用ng-show顯示或隱藏dom。 不需要JQuery。 例
<span ng-show="restaurant.delete">{{restaurant.name}} have been removed.</span>
<a class="btn-flat yellow-text" href="#"; ng-click="restaurant.delete=false">Undo<a>
這只是您可以改進的一個示例
當您使用jQuery添加HTML片段時,無法通過角度解析它。 這就是為什么您的html內的角度代碼正常工作的原因。
您可以使用$ compile服務。
var html = '<span>{{restaurant.name}} have been removed.</span><a class="btn-flat yellow-text" href="#"; ng-click="addRestaurant(deletedres[deletedres.length-1])">Undo</a>';
var linkFn = $compile(html);
var content = linkFn(scope);
$('body').append(content);
正如Harish指出的那樣,這是錯誤的。 所有使用DOM的操作都必須在指令中完成。 您可以創建指令,該指令負責在單擊按鈕時顯示一些消息(或自定義html模板)。
德米特里·別祖本科夫 ( Dmitry Bezzubenkov)是對的。 如果要使用Angular操作DOM,則應使用自定義指令執行此操作,而不是直接在控制器中執行。 為此,您可以參考$compile
服務。 這是該文件的正式文件 。
但是,對於您而言,我相信您真正想做的是從列表中刪除該項目,同時使該項目能夠從刪除中恢復。 從這個意義上講,您可以在Angular中嘗試這種方法:
$scope.res
和$scope.deletedres
) ng-click
使用ng-click
將其綁定到刪除按鈕。 在此功能中,您將從$scope.res
刪除該項目,然后將其推送到$scope.deletedres
$scope.deletedres
移至$scope.res
。 將此項目綁定到消息框中的UNDO
文本。 ng-repeat
在主容器中顯示$scope.res
列表,在消息框容器中顯示$scope.deletedres
。 就像這樣:
angular
.module('modelTest', [])
.controller('MainCtrl', function($scope) {
$scope.res = [
{id: 1, name: 'Restaurant1'},
{id: 2, name: 'Restaurant2'},
{id: 3, name: 'Restaurant3'}
];
$scope.deletedres = [];
$scope.delete = function(id) {
var item, obj, i, j;
for(i = 0, j = $scope.res.length; i < j; i++) {
obj = $scope.res[i];
if(obj.id === id) {
$scope.deletedres.push(obj);
$scope.res.splice(i, 1);
}
}
};
$scope.undo = function(id) {
var item, obj, i, j;
for(i = 0, j = $scope.deletedres.length; i < j; i++) {
obj = $scope.deletedres[i];
if(obj.id === id) {
$scope.res.push(obj);
$scope.deletedres.splice(i, 1);
}
}
}
});
這是示例代碼 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.