2016-01-20 75 views
1

我無法獲得在AngularJS指令中工作的兩種數據綁定方式。AngularJS指令中的數據綁定的兩種方式

下面是從模板我的HTML代碼,一個基本的控制器實例爲MyModel(這裏的數組)使用:

HTML

<select ng-if="mymodel" multipleselect values="mymodel"> 

DIRECTIVE

我有一個指令稱爲multipleselect:

return { 
    restrict: 'A', 
    scope : { 
    values : '=' 
    }, 
    link : function($scope, element, attrs){ 

    ... 
    $scope.values = ["some","nice","datas"]; //Actually works, the model is changed in the controller 

    $("select").change(function(){ //This is a callback, asynchronous situation 
     $scope.$apply(function() { //Using apply to notify the controller that we are changing its model 
      $scope.values = ["some","amazing","datas"]; //Not working :(
     }); 
    }); 
    } 
} 

爲什麼我的模型沒有更新第二個tim我改變它了嗎?

+0

你在哪裏定義'mymodel'財產?由於您在指令中使用了雙向綁定,因此應該在'multipleselect'指令的封閉/父元素範圍內定義'mymodel'屬性。 – Arkantos

+0

我過去用'ng-if'和類似的東西出現了問題,它會從DOM中刪除實際的元素並將其替換。不知道它是否可能是一個類似的問題。也只是爲了讓您知道您的更改會針對頁面上的每個選項啓動。您應該使用元素對象來將您的事件範圍限定爲指令。你也應該聽取銷燬事件,以便在「ng-if」中刪除處理程序時移除該處理程序。可能導致內存泄漏。 – ste2425

回答

2

看着給,我認爲這將滿足您的需求,而無需使用自定義指令答案:

<select ng-if="mymodel" multiple ng-model="model.mymodel"> 

你的模式將當選擇改變時可以自動更新,可以看到here

的egghead.io視頻"The Dot"有一個很好的概述,做到這一點非常流行的堆棧溢出問題:What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

+0

@ ste2425使用ng時應該總是使用'.'符號-model,看到這個小提琴:https://jsfiddle.net/vewk68xt/2/ –

+0

編輯:對不起,是我的壞被愚蠢, – ste2425

+0

@ ste2425檢查我的迴應 –

0

您不需要使用jQuery來監視更改。你可以寫這樣的(也解決您的問題):

return { 
    restrict: 'A', 
    scope : { 
    values : '=' 
    }, 
    link : function($scope, element, attrs){ 

    $scope.values = ["some","nice","datas"]; 

    element.on("change", function(){ 
     $scope.values = ["some","amazing","datas"]; 
    }); 
    } 
} 
+0

元素是一個jQuery(或jQLite,如果jQuery不包含在angular之前的)對象的指令。 – ste2425

+0

爲什麼不使用ng-change? –

+1

@MartijnWelker,因爲該指令沒有指定模板。您將不得不手動編譯html以添加「ng-change」的綁定。 – ste2425

相關問題