2013-04-01 9 views
5

Podoba mi się, że AngularJS nie wymaga specjalnej składni dla modeli, ale istnieje jeden scenariusz, który nie może się objąć. Podjąć następująceModele AngularJS, wiele zakresów i dwukierunkowe powiązanie danych

moich dataService okłady cokolwiek smak przechowywania danych Używam:

app.factory('dataService', function() { 
    var data = 'Foo Bar'; 

    return { 
     getData: function() { 
      return data; 
     } 
    }; 
}); 

Mam dwa kontrolery, że zarówno dostępu do tego samego kawałka danych:

app.controller('display', function($scope, dataService) { 
    $scope.data = dataService.getData(); 
}); 

app.controller('editor', function($scope, dataService) { 
    $scope.data = dataService.getData(); 
}); 

Jeśli następnie mieć dwa widoki, z których jeden modyfikuje dane, dlaczego druga aktualizacja nie jest automatyczna?

Rozumiem, jak działa to w stylu Knockout, w którym byłbym zmuszony uczynić z danych obiekt obserwowalny nokaut. Więc wszelkie modyfikacje w jednej części aplikacji wyzwalają subskrypcje i aktualizują widoki w innej. Ale nie jestem pewien, jak sobie z tym poradzić w Angular.

Każda rada?

+1

jeśli 'data' jest zakresy obiekt będzie dzielić odniesienie do tego samego obiektu, gdy dane jest prymitywny, zachowują wartość niezależnie – charlietfl

+2

problem nie jest związany kątowe, to sposób działa javascript http://jsfiddle.net/uGdEc/ – charlietfl

+0

@charlietfl Dokładnie. Podczas korzystania z warstwy modelu, takiej jak nokaut, tworzysz obiekty dla wszystkiego, co ma być obserwowalne. Usuń tę warstwę i wydaje się, że nie ma to sensu, jak prymitywy mogą być monitorowane (jak pokazuje twoje skrzypce). – nicholas

Odpowiedz

6

Jest kilka zmian, które sugerowałbym, aby działały.

  1. zmiana obiekt danych z ciągiem do obiektu typu
  2. Zastosowanie ng-model związać polu wprowadzania

HTML

<div ng-controller="display"> 
    <p>{{data.message}}</p> 
</div> 

<div ng-controller="editor"> 
    <input type="text" ng-model="data.message"/> 
</div> 

Script

app.factory('dataService', function() { 
    var data = {message: 'Foo Bar'}; 

    return { 
     getData: function() { 
      return data; 
     } 
    }; 
}); 

Demo: Fiddle

+0

nie na temat, powiązane, można zobaczyć mój q [tutaj] (http://stackoverflow.com/questions/20866954/angularjs-change-controller-by-condition/20867020?noredirect = 1 # 20867020) –

+1

@RoyiNamir Zdobywam w tym łupy ... ale nie jestem ekspertem od kątów –

1

Nie utknąłem z tą samą sytuacją, ale to, co wyskakuje na mnie, jest tym, co trzymacie w tym zakresie. Pojawiło się kanciaste wideo, w którym omawiano zakres. Powinieneś umieścić obiekty modelu w zakresie i nie używać zakresu jako obiektu modelu.

W twoim przykładzie zostaną utworzone dwa zakresy, każdy z ciągiem data. Ponieważ data jest ciągiem i niezmiennym, po zmianie zostanie zastąpiony w edytorze. W twoim przykładzie, jeśli masz dataService zwrócenie obiektu i ten obiekt jest współdzielony między kontrolerami, to może Twoje problemy zostaną rozwiązane. Wypróbujreturn model z {data: data} i połącz się zzamiast data.

To jest niesprawdzone, ale powinno działać w oparciu o znajomość prac kanciastych.

Powiązane problemy