2013-04-04 1 views
1

У меня есть сущность от Бриз, которая может иметь около 20 свойств, но затем я хочу обернуть объект в режиме просмотра и выставить только те несколько свойств как ko.observable(). Как мне сделать все, чтобы сделать уведомление об изменении свойств?Как я обертываю свой объект бриза в пределах модели просмотра, которая имеет несколько свойств, открытых как наблюдаемые.

В C#, я хотел бы сделать что-то вроде этого:

public double OtherSalesPercent 
{ 
get { return Model.OtherSalesPercent; } 
set 
{ 
    if (Model.OtherSalesPercent != value) 
    { 
    Model.OtherSalesPercent = value; 
    OnPropertyChanged("OtherSalesPercent"); 
    } 
} 
} 

UPDATE Jay спасибо за ответ. Я понимаю, что это делает это. Тем не менее, я не хочу, чтобы мое представление привязывалось напрямую к объектам, а скорее к viewmodel. Поэтому подумайте о названии, которое называется «Яблоки». И яблоки показывают список моделей просмотра apple. И каждый объект сущности имеет 30 различных свойств, но я хочу только выставить 3 из этих 30 свойств на модели просмотра apple. Итак, я хочу создать 3 ko.observable свойства на модели apple viewmodel, которая будет обрабатывать эти 3 свойства на объекте apple. То, что я до сих пор «работает», но я не считаю его самым чистым. Вот это свойство Имя:

var appleViewModel = function(appleEntity) { 
    var backingEntity = appleEntity; 

    var name = ko.observable(locationEntity.name()); 
    name.subscribe(function(newValue) { 
     backingEntity.name(newValue); 
    }); 

    var vm = { 
    name: name 
    }; 

    return vm 
}; 

Другая большая причина, это я использую jqxGrid, и у них есть вопросы, связываясь с Breeze сущности. Так что действительно, что я хочу, это appleViewModel, который будет обрабатывать эти свойства, но, если я изменю фактический объект apple (как в cancelChanges), я хочу, чтобы пользовательский интерфейс получил это изменение от сущности).

UPDATE 2

Это, кажется, дает мне все, что я хочу, и связывается с jqxGrid

var createViewModel = function(appleEntity) { 
    var entity = appleEntity; 

    var name = ko.observable(entity.name()); 
     name.subscribe(function(newValue) { 
      entity.name(newValue); 
     }); 
     entity.name.subscribe(function(newValue) { 
      name(entity.name()); 
     }); 

     var vm = { 
      name: name 
     }; 

     return vm; 
}; 

Но это только так кажется мне неправильным. Я в основном хочу двухстороннюю привязку. Поэтому, когда я изменяю свойство имени viewmodel, он меняет имя объекта поддержки ... и если я изменяю имя объекта поддержки, он обновит свойство name viewmodels.

Спасибо!

ответ

0

Я думаю, что это то, что вы ищете ko.computed:

var data = { 
    OtherSalesPercent: 0.99 
}; 


function Model(data) { 
    this.OtherSalesPercentValue = ko.observable(data.OtherSalesPercent); 

    this.OtherSalesPercent = ko.computed({ 
     read: function() { 
      return Model.OtherSalesPercentValue(); 
     }, 
     write: function (value) { 
      if (this.OtherSalesPercentValue() != value) { 
       this.OtherSalesPercentValue(value); 
      } 
     }, 
     owner: this 
    }); 
} 

Example

+0

Это прекрасно работает. Кажется, что jqxGrid имеет проблемы с значениями ko.computed при записи. –

0

Обеспечивая я понял ваш вопрос, у вас есть несколько вариантов.

Во-первых, по умолчанию бриз составляет всякая сущность-свойство «наблюдаемое» в соответствии с выбранными вами условными обозначениями «modelLibrary». Поэтому, чтобы быть понятным, если вы извлекаете данные, которые ветерок распознает как сущность, а библиотека модели бриза - «ko» (по умолчанию, если вы не настроили ее), то каждое свойство объекта будет автоматически вызываться нокаутом.

Это происходит только в том случае, если ваш запрос возвращает «сущности». Breeze определяет, содержит ли ваш результат запроса сущности, ища соответствующий entityType, определенный в клиенте MetadataStore.

Если возвращенные данные не являются сущностью или совокупностью объектов, то ветер просто возвращает ее необработанной. Это может произойти, если вы выполняете проекцию только выбранных полей. то есть

var query = EntityQuery.from("Orders").select("customer, orderDate"); 

В этом случае каждый элемент в результатах запроса, возвращенных в обещание обратного вызова будет просто объект с двумя простыми свойствами, а «клиентов» и «ORDERDATE», ни один из которых можно будет наблюдать.

Исходя из вашего вопроса, однако, мне интересно, только то, что вы хотите сделать, - это разоблачить только подмножество каждого объекта на стороне сервера, но все же хотите изменить управление изменениями и наблюдаемость. Если это так, вы можете заставить свои методы на стороне сервера возвращать DTO, а затем сообщать клиенту breeze, что это «сущностные типы», указав метаданные о каждой форме DTO. Это можно сделать наиболее легко на клиенте, используя метод MetadataStore.addEntityType для каждой формы DTO, которую вы планируете вернуть. Документация о бризе более подробно рассматривается по этой теме.

Я не уверен, что это то, о чем вы просили, но ... Надеюсь, это поможет.

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