X-editable 如果它不再在动态源中,如何显示保存的值
X-editable how to show saved value if it is not in the dynamic source anymore
我在新项目中使用 X-editable 和 bootstrap。
我使用的是动态源,效果很好。新值保存在数据库中,没有问题。
问题是我有多个 select 选项,其中一些应该只 selected 一次。这就是我使用动态源的原因。
当我 select 一个值应该只 selected 一次时,问题就出现了,因为更新源时,保存的值将不再存在于源中。
如果我 select 任何其他值,它会正确显示更新后的值。如果我刷新页面,新值也会正确显示(但这当然是因为 html 代码中的 $object->award->name 只是显示新值)。
我在过去的几个小时里尝试了很多不同的东西,但我无法让它正常工作。
我该如何解决这个问题?
这是javascript:
$(function(){
//edit form style - popup or inline
$.fn.editable.defaults.mode = 'popup';
$('.pUpdate').editable({
validate: function(value) {
if($.trim(value) == '')
return 'Value is required.';
},
type: 'text',
url: posturl,
title: 'Edit Status',
placement: 'top',
send:'always',
emptytext: 'Click to add a value',
sourceCache: false,
ajaxOptions: {
dataType: 'json'
},
success: function(response, newValue) {
// refresh total probability
updateProbability();
// this does not work:
//var $that = $(this);
//setTimeout(function() {
// $that.editable('option', 'source', {{ $app['url_generator']->generate('wheeloffortune-getawardsforselect', ['wheel_id' => $wheel->id]) }});
//}, 0);
// this does not work:
// return {newValue: response.newValue};
}
})
});
这是 html 元素:
<td><a class="pUpdate update_awards"
data-pk="{{ $object->id }}"
data-name="award_id"
data-type="select"
data-source="{{ $app['url_generator']->generate('myroute', ['param' => $object2->id]) }}"
data-emptytext="Click to select a value"
>{{ $object->award->name }}</a></td>
据我所知,X-editable 不支持这个。
所以我不得不求助于用 jQuery 简单地更新文本。我确保 json 响应包含我想要显示的新文本,并且在成功回调中我调用了一个函数来更新相关元素的文本。
javascript 现在看起来像这样:
$(function(){
//edit form style - popup or inline
$.fn.editable.defaults.mode = 'popup';
$('.pUpdate').editable({
validate: function(value) {
if($.trim(value) == '')
return 'Value is required.';
},
type: 'text',
url: posturl,
title: 'Edit Status',
placement: 'top',
send:'always',
emptytext: 'Click to add a value',
sourceCache: false,
ajaxOptions: {
dataType: 'json'
},
success: function(response, newValue) {
// refresh total probability
updateProbability();
// update text for award elements only
var element = $(this);
if(element.hasClass('update_awards')) {
updateText(element, response);
}
}
})
});
function updateText(element, response) {
$(document).ajaxComplete(function() {
element.text(response.newText);
element.removeClass('editable-empty');
});
}
请注意,我还必须删除可编辑的空白 class。
我在这里可能有点幸运,因为我在成功回调中已经有了函数 updateProbabilityAjax(),它正在执行 Ajax 请求,这就是为什么我能够使用.ajaxComplete()。
我注意到一旦 X-editable 从服务器获得成功响应,但在它完成更新页面上的元素之前,就会触发成功回调。
如果没有等待 jQuery ajax 请求,我将别无选择,只能在函数 updateText 中使用 setTimeout()。如果没有它,X-editable 将在我的函数 updateText 更新它之后实际更新元素 :)
希望这对某人有所帮助!
我在新项目中使用 X-editable 和 bootstrap。
我使用的是动态源,效果很好。新值保存在数据库中,没有问题。
问题是我有多个 select 选项,其中一些应该只 selected 一次。这就是我使用动态源的原因。
当我 select 一个值应该只 selected 一次时,问题就出现了,因为更新源时,保存的值将不再存在于源中。 如果我 select 任何其他值,它会正确显示更新后的值。如果我刷新页面,新值也会正确显示(但这当然是因为 html 代码中的 $object->award->name 只是显示新值)。
我在过去的几个小时里尝试了很多不同的东西,但我无法让它正常工作。
我该如何解决这个问题?
这是javascript:
$(function(){
//edit form style - popup or inline
$.fn.editable.defaults.mode = 'popup';
$('.pUpdate').editable({
validate: function(value) {
if($.trim(value) == '')
return 'Value is required.';
},
type: 'text',
url: posturl,
title: 'Edit Status',
placement: 'top',
send:'always',
emptytext: 'Click to add a value',
sourceCache: false,
ajaxOptions: {
dataType: 'json'
},
success: function(response, newValue) {
// refresh total probability
updateProbability();
// this does not work:
//var $that = $(this);
//setTimeout(function() {
// $that.editable('option', 'source', {{ $app['url_generator']->generate('wheeloffortune-getawardsforselect', ['wheel_id' => $wheel->id]) }});
//}, 0);
// this does not work:
// return {newValue: response.newValue};
}
})
});
这是 html 元素:
<td><a class="pUpdate update_awards"
data-pk="{{ $object->id }}"
data-name="award_id"
data-type="select"
data-source="{{ $app['url_generator']->generate('myroute', ['param' => $object2->id]) }}"
data-emptytext="Click to select a value"
>{{ $object->award->name }}</a></td>
据我所知,X-editable 不支持这个。
所以我不得不求助于用 jQuery 简单地更新文本。我确保 json 响应包含我想要显示的新文本,并且在成功回调中我调用了一个函数来更新相关元素的文本。
javascript 现在看起来像这样:
$(function(){
//edit form style - popup or inline
$.fn.editable.defaults.mode = 'popup';
$('.pUpdate').editable({
validate: function(value) {
if($.trim(value) == '')
return 'Value is required.';
},
type: 'text',
url: posturl,
title: 'Edit Status',
placement: 'top',
send:'always',
emptytext: 'Click to add a value',
sourceCache: false,
ajaxOptions: {
dataType: 'json'
},
success: function(response, newValue) {
// refresh total probability
updateProbability();
// update text for award elements only
var element = $(this);
if(element.hasClass('update_awards')) {
updateText(element, response);
}
}
})
});
function updateText(element, response) {
$(document).ajaxComplete(function() {
element.text(response.newText);
element.removeClass('editable-empty');
});
}
请注意,我还必须删除可编辑的空白 class。
我在这里可能有点幸运,因为我在成功回调中已经有了函数 updateProbabilityAjax(),它正在执行 Ajax 请求,这就是为什么我能够使用.ajaxComplete()。 我注意到一旦 X-editable 从服务器获得成功响应,但在它完成更新页面上的元素之前,就会触发成功回调。 如果没有等待 jQuery ajax 请求,我将别无选择,只能在函数 updateText 中使用 setTimeout()。如果没有它,X-editable 将在我的函数 updateText 更新它之后实际更新元素 :)
希望这对某人有所帮助!