2016-02-24 63 views
4

裏面比方說,我有以下看法:元素上設置手錶NG-如果

<div ng-if='some === "something"'> 
    <input type="text" ng-model="foo.Bar"/> 
</div> 

在控制器some設置:

foo.controller('fooFoo', 
    function fooFoo($scope) { 
     $scope.some = "something"; 
     $scope.$watch('foo.Bar',function (nVal, oVal) { etc...}); 
    } 
); 

提供的輸入與ng-ifwatch沒有按一個div內沒有工作。

爲什麼?我能以某種方式使它工作嗎?

+0

哪裏是你的範圍'foo'? –

回答

2

您必須在控制器內創建foo的空對象。

foo.controller('fooFoo', 
    function fooFoo($scope) { 
     $scope.foo = {}; 
     $scope.some = "something"; 
     $scope.$watch('foo.Bar',function (nVal, oVal) { etc...}); 
    } 
); 

推薦:可以使用NG-變化,而不是$ $範圍腕錶()。因爲$ watch對角度應用程序性能來說是不好的做法。

使用NG-變化(HTML):

<div ng-if='some === "something"'> 
    <input type="text" ng-model="foo.Bar" ng-change="onChange()"/> 
</div> 

JavaScript的:

foo.controller('fooFoo', 
    function fooFoo($scope) { 
     $scope.some = "something"; 

     $scope.onChange = function(){ 
      console.log($scope.foo.Bar); 
    }; 
    } 
); 
+0

說實話我省略了一些細節。 Foo對象是在表單加載時創建的,但是在從服務器檢索一些數據後執行的回調函數中創建。對我來說還是有點模糊,因爲如果我不使用ng-if指令,這個解決方案就可以工作,但聲明對象(這裏是$ scope.foo = {})已經有所幫助。感謝您指點改變。我不知道它是更好還是存在,但它還有一個優勢 - 當foo未聲明時,拋出異常,而$ watch則不拋出異常。感謝您對納賽爾的幫助。 – Landeeyo

+0

@Landeeyo歡迎您 –

2

使用ng-changeinput元件,而不是在控制器$watch

1

我認爲問題是ng - 如果創建它自己的範圍。然後我們有fooFoo範圍(父)和ng-if範圍。

屬性foo.Bar初始時(page init)在兩個範圍內都可用,並且由於繼承而指向相同的地方(fooFoo控制器中的foo.Bar屬性)。但是,在更改輸入元素(在ng-if範圍內)後,ng-if範圍中的foo.Bar指向其自己的範圍屬性,因此fooFoo控制器中的foo.Bar未發生更改。

如果你使用controllerAs我認爲它會得到解決。

是這樣的:

<div ng-controller="fooFoo as ff"> 
    <div ng-if='ff.some === "something"'> 
     <input type="text" ng-model="ff.foo.Bar"/> 
    </div> 
</div> 

你控制器:

foo.controller('fooFoo', 
    function fooFoo($scope) { 
     var ff = this; 
     ff.some = "something"; 
     $scope.$watch('ff.foo.Bar',function (nVal, oVal) { etc...}); 
    } 
); 
+0

感謝您實際指出問題的範圍 –