2013-01-04 14 views
1

我使用我的項目AngularJs,我已經連接到一個下拉我的視圖模型屬性(<選擇>)如何防止財產變化對角JS

該下拉列表中有一個空值女巫是默認選中的,我想要的是防止用戶在選擇其他值後選擇該空值。

香港專業教育學院開始尋找到$手錶,但我不知道是否有某種方式來取消「喝這個屬性改變」,有些事情是這樣的:

$scope.$watch('myProp', function (newVal, oldVal, scope) { 
    if (newVal) { scope.preventDefault(); } 
} 

任何想法,這是基礎的想法,在更高級的開發中,我需要詢問用戶的確認。

有什麼想法?

回答

-1

實際上,刪除空值更容易。假設你有選項一個列表:

$scope.options = [{value: ''}, {value: 'abc'},{value: 'def'}]; 

select

<select ng-model="select" ng-options="o.value for o in options"></select> 

然後$watch模型:

$scope.$watch('select', function(value) { 
    if (value && value !== '') { 
     if ($scope.options[0].value === '') { 
      $scope.options = $scope.options.slice(1); 
     } 
    } 
}, true); 

看到它在行動here

PS不要忘記$ watch中的objectEquality參數,否則它將不起作用!

+0

在似乎NG-選項已經添加了一個空的選擇小提琴,所以沒有必要手動添加一個 –

+0

確實很奇怪。看起來,角色的選擇已經在框 – asgoth

+0

@LiviuT:看起來,如果你不添加一個子選項,在選擇標籤的主體中有一個空值,角將爲你添加它。 – asgoth

2

您可以將ng-required添加到選擇。 如果有那麼一個空的選項將被添加任何初始值的模型,並在更改爲一個有效的值將刪除空選項

EDITEDjsFiddle恢復到以前的值,幷包括ng-change指令。

從文檔:

表達時的值變化從模型來不評估。

這是不與變化聽衆干擾和在$apply功能

控制器

$scope.options = [{value: 'abc'},{value: 'def'}]; 

var confirmDialog = function(newVal, yes, no) { 
    // obviously not a good way to ask for the user to confirm 
    // replace this with a non blocking dialog 

    //the timeout is only for the confirm since it's blocking the angular $digest 
    setTimeout(function() { 
     c = confirm('Is it ok? [' + newVal.value + ']'); 
     if(c) { 
      yes(); 
     } 
     else { 
      no(); 
     } 
    }, 0); 
}; 

//Asking for confirmation example 
function Ctrl($scope) { 
    $scope.options = [{value: 'abc'},{value: 'def'}]; 

    $scope.select = undefined; 
    var oldSelect = undefined; 
    $scope.confirmChange = function(select) { 
     if(oldSelect) { 
      confirmDialog(select, 
       function() { 
        oldSelect = select; 
       }, 
       function() { 
        $scope.$apply(function() {$scope.select = oldSelect;}); 
       }); 
     } 
     else { 
      oldSelect = select; 
     } 
    } 
} 

模板

<div ng-controller="Ctrl"> 
    <select ng-model="select" ng-options="o.value for o in options" ng-required ng-change="confirmChange(select)"></select> 
</div> 
恢復舊值時產生一個無限循環有用
2

我想是阻止用戶選擇空值後,他選擇一些其他的價值

這應該爲你自動發生的,只要你不分配NG-模型屬性的值原來。因此,使用如下所示的<select>,在你的控制器不初始化$ scope.selected_year:

<select ng-model="selected_year" ng-options="year for year in years"></select> 

當列表顯示最初,角將增加一個選項,這樣對HTML,因爲$ scope.selected_year是目前未設置爲一個有效的選項/值:

<option value="?" selected="selected"></option> 

選擇一個有效的選擇後,該選項會奇蹟般地消失,因此用戶將無法再選擇它。嘗試在這fiddle

如果NG-模型屬性已經當第一次顯示的選擇列表中指定一個有效的值,那麼你可以指定一個控制器功能於undocumented NG-變化參數:

<select ... ng-change="preventUserFromDoingXzy()"> 

內部功能preventUserFromDoingXzy( )你可以做你需要做的事來控制用戶可以選擇或修改模型。

0

大概做會增加初始選項和設置就可以了disabled的最簡單,最乾淨的東西:

<option value="?" selected="selected" disabled></option>