預編譯模板[免責聲明:我剛剛在我身後有幾個角周]Angular.js:選擇根據條件
在角應用程序,我試着寫,我需要顯示一些信息並讓用戶編輯它,只要他們激活了一個開關。相應的HTML是:
<span ng-hide="editing" class="uneditable-input" ng:bind='value'>
</span>
<input ng-show="editing" type="text" name="desc" ng:model='value' value={{value}}>
其中editing
是布爾(通過開關設置)和value
模型。
我想這是一種情況指令是專爲和我一直在嘗試實施一種情況。這個想法是預編譯<span>
和<input>
元素,然後根據editing
布爾值的值選擇顯示哪一個。這是我到目前爲止有:
angular.module('mod', [])
.controller('BaseController',
function ($scope) {
$scope.value = 0;
$scope.editing = true;
})
.directive('toggleEdit',
function($compile) {
var compiler = function(scope, element, attrs) {
scope.$watch("editflag", function(){
var content = '';
if (scope.editflag) {
var options='type="' + (attrs.type || "text")+'"';
if (attrs.min) options += ' min='+attrs.min;
options += ' ng:model="' + attrs.ngModel
+'" value={{' + attrs.ngModel +'}}';
content = '<input '+ options +'></input>';
} else {
content = '<span class="uneditable-input" ng:bind="'+attrs.ngModel+'"></span>';
};
console.log("compile.editing:" + scope.editflag);
console.log("compile.attrs:" + angular.toJson(attrs));
console.log("compile.content:" + content);
})
};
return {
require:'ngModel',
restrict: 'E',
replace: true,
transclude: true,
scope: {
editflag:'='
},
link: compiler
}
});
(全HTML + JS可here)。
現在,指令不會執行任何操作,只能在控制檯上輸出一些消息。如何將我的html的<toggle-edit ...>
元素替換爲我在指令中定義的content
?如果我正確理解了文檔,我應該在鏈接之前編譯content
:這應該是指令compile
的preLink
方法,對吧?但是,我如何在實踐中實施它?
獎金的問題:我希望能夠利用這個<toggle-edit>
元素與一些選項,比如:
<toggle-edit type="text" ...></toggle-edit>
<toggle-edit type="number" min=0 max=1 step=0.01></toggle-edit>
我能上的各種選項的存在增加測試(像我在上面的例子中爲min
做過),但是我想知道是否有更聰明的方法,比如在定義模板時一次性將所有attrs
但ngModel
和editflag
一起放入?
感謝您的任何見解。
感謝您的鏈接到的教程,這是相當有幫助的。基本上,你提出的解決方案是*不*選擇模板,而是輸出一個模板,其元素可以按需隱藏。這是一個想法。儘管如此,由於'compile'函數還沒有作用域,當創建模板時,父模型不可訪問。我怎樣才能將模板鏈接到父模型? –