2012-06-13 2 views
1

Я разрабатываю страницу настроек пользователя, и я решил использовать AngularJS для управления состоянием данных.AngularJS и embedded framework html

То, что я хотел бы получить, - это страница, показывающая настройки текущего пользователя и позволяющая пользователю редактировать их, отменять их изменения или сохранять &, чтобы отправить изменения, если они того пожелают. Я привязал свои ярлыки и элементы ввода к модели, чтобы, когда пользователь изменяет свой адрес электронной почты, он отображается правильно.

Я основывая свою работу с этого примера № 3, кстати: http://code.angularjs.org/1.0.0rc12/docs-1.0.0rc12/guide/forms

Мой вопрос связан с использованием значений по умолчанию для страницы. Поскольку модель определена как объект в Javascript. В приведенной выше ссылке значения по умолчанию можно установить здесь в $scope.master= {};, который отлично работает, за исключением того, что я использую фреймворк для создания статической страницы и не извлекаю объект json с моего сервера. Мои страницы написаны во встроенной scala, поэтому я обращаюсь к значениям serveride. Каков наилучший способ получить информацию, полученную на сервере, и превратиться в объектную клиентскую сторону, к которой может обращаться javascript?

ответ

1

У вас есть несколько вариантов. То, как я буду делать это, будет толкать начальное состояние (через WebSocket или что-то еще) на Angular как JSON или иметь Угловое вытягивание его с сервера через HTTP-вызов.

Возможно, вы также можете сделать страницу с тегами ng-init, чтобы установить начальное состояние, но этот способ кажется мне странным.

<div ng-controller="FormController" ng-init="formData = {}"> 
    <form> 
    <input ng-model="formData.input1" ng-init="formData.input1 = 'initialValue'> 
    </form> 
</div> 
+0

ng-init должен работать для меня просто отлично. В конце концов, я переведу все, чтобы использовать AJAX и получить данные через отдельный HTTP-вызов; мы просто очень напряженно расписаны и не хотим усложнять ситуацию. :) – sbilstein

+0

Я не уверен, что документы AngularJS рекомендуют не использовать ng-init: http://docs.angularjs.org/guide/dev_guide.mvc.understanding_model Они не приводят причину, но рекомендуют использовать это например приложений, а не в производстве. – sbilstein

1

Я использую ASP.NET и Dapper-Dot-Net. Я использую следующие методы, чтобы получить мои данные на странице, а затем в Угловую область. Он должен быть достаточно переносимым для вашей среды.

  1. Определение класса DataTransferObject на странице на стороне сервера и публичная строка называется DtoJson провести последовательную версию вашего экземпляра класса.

    private class DataTransferObject{ 
        public User User; 
        public List<Project> Projects 
    } 
    
    public string DtoJson; 
    
    var dto=new DataTransferObject(); 
    var userName="however you get a username"; 
    dto.User=User.Get(userName); // I already have a User class 
    var sql="select * from projects where user_name=:UserName"; 
    var p=new DynamicParameters(); 
    p.Add(":UserId", dto.User.ID); 
    dto.Projects=Project.Query<Project>(sql, p); // returns a list of Project 
    
    // I use json.net to convert the Dto to json and expose it as a public variable 
    var DtoJson=Json.Convert(dto); // approximate syntax but you get the idea 
    
  2. На стороне клиента я ставлю тег сценария в голове страницы и ввести DtoJson в него, чтобы получить его в глобальную область видимости

    <script>var dto=<%=DtoJson%>;</script> 
    
  3. В нижней части моей страницы У меня есть сценарий src = "pageName.js", который является моим файлом с угловым контроллером. Внутри контроллера я говорю

    $scope.dto=dto; 
    console.log($scope.dto); 
    
  4. Теперь JSON, который был создан на стороне сервера находится в области видимости моего контроллера, и я могу данные связываются с {{dto.User.FIRST_NAME}} и {{dto.Projects [ 0] .ID}} ng-repeat = "для p в dto.Projects" и т. Д.

Я надеюсь, что это имеет смысл.

Peter

+0

Спасибо за комментарий Питер. Объяснение полностью имеет смысл и было одним из способов, которым я собирался это сделать. В угловых документах упоминается, что использование решения ng-init выше не рекомендуется для производственных приложений, но не упоминает, почему. Ваше решение выглядит как одинаково подходящий для меня подход, хотя создание встроенной переменной было чем-то, чего я хотел избежать (в основном для целей стиля). Нечто подобное должно быть достаточно простым, чтобы реализовать в мире Scala/Play. – sbilstein

+0

Встроенная переменная немного уродская, я согласен. Возможно, лучший подход - создать сервис и ввести его в контроллер. – pjsvis

Смежные вопросы