2014-10-23 2 views
2

У меня есть простое требование в приложении Ember, которое дает мне возможность.Ember - привязка динамического значения

Я хочу, чтобы принять это:

{{view Ember.TextField valueBinding="fields.firstName"}} 

И сделать поле Имя переменной. Это намерение, но, очевидно, не работает:

{{view Ember.TextField valueBinding="fields.{{fieldName}}"}} 

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

+0

Используйте только 'значение = fields.fieldName'. Нет цитат – MilkyWayJoe

+0

Неправильно. Это привязывается к ключу «fieldName» в полях, который фактически не существует. – LAW

ответ

1

Вместо того, имея TextField отслеживать переменную непосредственно вам нужно будет иметь TextField отслеживать вычисляемое свойство, и имеют вычисленное свойство отслеживать переменное.

Например, если у вас одновременно firstName и lastName вы можете сделать что-то вроде этого ...

App.IndexController = Ember.Controller.extend({ 

    //These are the fields you would want to edit 
    firstName: 'Tom', 
    lastName: 'Dale', 

    //this is so that we can create a selectbox to choose which field to edit 
    availableFields: ['firstName', 'lastName'], 
    selectedField: 'firstName', 

    //This is the computed property which tracks the selected field 
    //The text input would be bound to this 
    fieldValue: function(key, value){ 
    var selectedField = this.get('selectedField'); 
    if (value) { 
     this.set(selectedField, value); 
    } 
    return this.get(selectedField); 
    }.property('selectedField') 

}); 

Вы можете увидеть рабочий бункер здесь: http://emberjs.jsbin.com/juhika/1/edit?html,js,output

+0

Вот и все! Я не использовал тот факт, что вычисляемые свойства могут использоваться для установки значения, о котором идет речь. – LAW

+1

Обратите внимание, что синтаксис для вычисляемых свойств теперь изменен: http://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_new-computed-syntax – klavado

0

Для динамического связывания значений создают вычисленное свойство на контроллере:

http://emberjs.com/guides/object-model/computed-properties/

Также я считаю, valueBinding осуждается. Используйте значение вместо этого.

Вот еще один подобный вопрос: Ember TextField valueBinding with dynamic property

+0

Это не полезно. Другой вопрос: 1.5 лет, что навсегда во время Эмбер, и это также не полностью отвечает на вопрос. И делать немного копания приводит меня к никакому знаку, что valueBinding устарело. – LAW

+0

valueBinding определенно не рекомендуется. Вы ответили довольно быстро. Вы пытались создать вычисляемое свойство в контроллере и ссылаться на него в шаблоне как на значение, переданное в текстовое поле? Я бы создал ember.jsbin для вас, но, честно говоря, я нахожусь на работе и просто пробираюсь сюда. –

+0

Я пробовал много способов исправить это, включая то, что вы предложили. Если вы хотите быть полезным, пожалуйста, дайте реальный код, который делает вещь. Он должен быть одним лайнером, возможно, с небольшой вычислительной функцией, поэтому я не прошу многого. Но если вы не знаете ответа, пожалуйста, не просто бросайте что-то, что вы думаете «должно» работать. То, что «должно» работать, здесь не работает. – LAW

2

Вы должны создать вычисляемое свойство, которое будет слушать fieldName и затем вернуть значение.

См. Например jsbin. Это то, что вы пытаетесь сделать? Имейте в виду, что Handlebars довольно «тупые», преднамеренно, и не могут действительно выполнять сложные вычисления так, как вы могли бы использовать из угловой или другой структуры. Контроллер должен все это обработать.

App.IndexController = Ember.Controller.extend({ 

    fields: { 
    field1: 'test', 
    field2: 'test2' 
    }, 

    fieldName: '', 

    myFieldName: function() { 
    var fields = this.get('fields'); 
    var fieldName = this.get('fieldName'); 

    return fields[fieldName]; 

    }.property('fieldName') 

}); 

Затем, на ваш взгляд, привязывается к myFieldName.

{{view Ember.TextField valueBinding=myFieldName}} 
+0

Я думаю, что ваш пример имеет ту же проблему, что и моя. Идея заключается в том, что если вы попытаетесь отобразить поля позже, единственный способ, которым он правильно связывается, - это использовать постоянную строку. – LAW

+0

Я думаю, что это намеренное поведение. Уровень представления не должен действительно делать вычислительные вещи, такие как доступ к элементу массива или объекта. Это также позволяет вам легко протестировать это поведение, поскольку оно инкапсулировано в логику контроллера. –

2

Вы можете связать входные значения с динамические ключи (переменные) с помощью Мут хелперов Теперь

https://guides.emberjs.com/v2.6.0/templates/input-helpers/#toc_binding-dynamic-attribute

{{view Ember.TextField valueBinding=(mut (get fields fieldName))}} 

Проверьте следующий пример,

var Object = {}; 
var key = "firstName"; 

Мы можем связать ключ ввода помощника, как это,

{{input value=(mut (get Object key))}} 

{{Object.firstName}} // Prints the dynamic value in textbox